2012-06-28 44 views
5

Rails modelimin içinde bir dizi barındıracak bir örnek değişkeni başlatmak istiyorum ve bu değişkene modelimdeki diğer yöntemlerde erişmek istiyorum. Bu çalıştı:Rails Modelinde Örnek Değişkenler Model

class Participant < ActiveRecord::Base 

    @possible_statuses = [ 
    'exists', 
    'paired', 
    'quiz_finished', 
    'quiz_results_seen', 
    'money_sent' 
    ] 

    def statuses 
    @possible_statuses 
    end 

Ama şu kullanarak raylar konsolu çalıştığımızda: Ben :(

nil döndü am

Participant.first.statuses 

Bunun nedeni nedir gerçekleştirmek için bir yolu var mı? Ne yapmaya çalışıyorum?

cevap

3

benim için en iyi cevabı bir sınıf değişkeni yaratmaktı değil bir örnek değişkeni:

@@possible_statuses = [ 
    'exists', 
    'paired', 
    'chat1_ready', 
    'chat1_complete' 
] 

Sonra serbestçe sınıfın yöntemlerinde bu erişebilir:

def status=(new_status) 
    self.status_data = @@possible_statuses.index(new_status) 
    end 
+1

Eğer bu sınıf değişkenin değeri sabit olacaksa, bu başka bir şey değildir." http://stackoverflow.com/questions/9396563/why-should- biz-önlemek kullanan sınıf-değişkenleri-in-ray – Bot

10

Bu gibi durumlarda bir sabit kullanmanız önerilir:

class Participant < ActiveRecord::Base 

    STATUSES = [ 
    'exists', 
    'paired', 
    'quiz_finished', 
    'quiz_results_seen', 
    'money_sent' 
    ] 

sadece STATUSES yapın ve örnekte dış sınıf kullanımı Participant::STATUSES

2

itibaren @possible_statuses, iç sınıftan bu diziyi erişmek istiyorsanız sınıfı ziyade her bir örneği üzerinde bir değişkendir nesne.

class Participant < ActiveRecord::Base 

    @possible_statuses = [ 
    'exists', 
    'paired', 
    'quiz_finished', 
    'quiz_results_seen', 
    'money_sent' 
    ] 

    def self.possible_statuses 
    @possible_statuses 
    end 

    def possible_statuses 
    self.class.possible_statuses 
    end 

    def statuses 
    possible_statuses 
    end 

end 

, diğer cevaplar belirtilen durumların bu liste hiç değişirse, yerine bir değişken daha sabit bir kullanmalıdır gibi: Burada bunu gerçekleştirmek nasıl bir oldukça ayrıntılı bir örnektir.

+0

Ben 2 modelleri var : İş ve Organizasyon. Bir kuruluş has_many işi ve bir kuruluş bir kuruluşa aittir. Kuruluşlar iş yayınladıktan sonra uygulamanızın herhangi bir yerinde görülmesi için onaylanması gerekiyor. Her ikisi de aranabilir (her zaman bulunabilmeleri için onaylanmaları gerekir). Benim yapmak istediğim, iş modelimde "organizasyonu onaylanmış işler" olan bir değişkendir. Böylece, iş için arama yöntemini yazdığımda, "@ approved_jobs.where ('LIKE ismi ve LIKE tanımı', params [: search], params [: search]) gibi bir şeye sahip olabilirim. Ihtiyacım olan @approved_jobs değişkenini tanımlayın thx – Myna

+0

Bu sorunu çözmek için veritabanını kullanırdım.İşleri tablosuna onaylanmış bir boolean alanı ekleyin ve sonra bir kapsam ekleyin - "scope: onaylanmış, nerede (: approved => true)". Daha sonra Job.approved yerine @approved_jobs kullanın. –

+0

Kuruluş tablosunda onaylanmış bir boole var ve Jobs için onaylanmış bir boole yok. Eğer bir iş için de bir boole kurarsam, nasıl diyebilirim? onaylandı, tüm işlerinin de onaylanması gerekiyor. Ve tam tersi "dernekleri ve modelleri kullanarak? – Myna

0

Örnek değişkeni yalnızca modeli oluşturduğunuzda, herhangi bir veritabanında depolanmadığından mevcut olacaktır. Nobita'nın önerisine göre bunu sabit yapmak isteyeceksiniz. Alternatif olarak, IMO, ... bu bir modül gibi bu size biraz daha fazla kontrol ve esneklik verir

module Status 
    EXISTS = "exists" 
    PAIRED = "paired" 
    QUIZ_FINISHED = "quiz_finished" 
    QUIZ_RESULTS_SEEN = "quiz_results_seen" 
    MONEY_SENT = "money_sent" 

    def self.all 
    [EXISTS, PAIRED, QUIZ_FINISHED, QUIZ_RESULTS_SEEN, MONEY_SENT] 
    end 
end 

yapabiliriz. Modelinize yerleştirilmiş bu kodu dahil edersiniz.