2009-01-26 18 views
5

Czy istnieje sposób, aby uzyskać listę modeli, do których należy dany model w Railsach?Dostęp do asocjacji w Railsach

Na przykład:

class Project < ActiveRecord::Base 
    has_one :status 
    ... 
end 

class Task < ActiveRecord::Base 
    has_one :status 
    ... 
end 

class Status < ActiveRecord::Base 
    belongs_to :project 
    belongs_to :task 

    # this is where I want to be able to pass in an array of the associations' class 
    # names (to be used for checking input) rather than having to do w%{ project task } 
    # which leaves it open to failure if I add new associations in future 
    validates_inclusion_of :status_of, :in => ? 
    ... 
end 

Nadzieja to sprawia, że ​​jakiś sens!

Odpowiedz

6

To będzie Ci hash obiektów opisujących stowarzyszenia i inne rzeczy w danym modelu Model.reflections. Chcesz wszystkie wartości w haśle, które są klasami Reflection::AssociationReflection. Ten kod powinien dostarczyć Ci żądaną tablicę:

association_names = [] 
Model.reflections.each { |key, value| association_names << key if value.instance_of?(ActiveRecord::Reflection::AssociationReflection) } 
+0

Dokładnie tego, czego szukałem! Wielkie dzięki. –

+0

Niesamowita odpowiedź. Spot na miejscu. – Tilendor

3

Można użyć jednej tablicy do określenia skojarzenia i używać w walidacji jak:

BELONGS_TO_LIST = w%{ project task } 
BELONGS_TO_LIST.each {|b| belongs_to b} 
validates_inclusion_of :status_of, :in => BELONGS_TO_LIST 
+0

Dzięki. Nie jest to metoda, o której myślałem, ale działa to przyjemnie. –