2013-07-06 30 views
5

Zastanawiasz się, czy istnieje łatwy sposób określenia dynamicznie, jeśli powiązanie modelu jest relacją "has_one" lub "has_many" (tj. Jest to powiązanie z jednym obiektem lub wieloma).Railsy określają, czy asocjacja ma has_one lub has_many

Używam MongoMapper, więc jestem w stanie sprawdzić, czy klasa klass jest skojarzony modelu assoc z jednej lub wielu relacji poprzez

klass.associations[:assoc].is_a? MongoMapper::Plugins::Associations::OneAssociation 
klass.associations[:assoc].is_a? MongoMapper::Plugins::Associations::ManyAssociation 

ale to wydaje się raczej niezgrabne i nie jest nazwą rodzajową (nie będzie działać również dla stowarzyszeń ActiveRecord). Chciałbym również uniknąć ładowania jakichkolwiek obiektów, więc jestem całkiem pewny, że instance.assoc.is_a? Array też się wyłączył.

Wszelkie pomysły?

+0

Czy kiedykolwiek wymyśliłeś to? Właśnie przyszedłem znaleźć to samo, ale tylko dla 'ActiveRecord' – MCB

Odpowiedz

6

UPDATE: Tak, ja się na metodach Refleksje klasy http://api.rubyonrails.org/classes/ActiveRecord/Reflection/ClassMethods.html

można uzyskać wszystkie has_many, belongs_to itp z reflect_on_all_associations metody. Wszystko tam jest. Lub można umieścić w połączeniu w reflect_on_association i powie to, czy jest to has_many, has_one, itd. W szczególności:

Model.reflect_on_association(:assoc).macro 

To powinno wystarczyć dla wszystkich przypadków. W rzeczywistości nie rozwiązuje problemu, nad którym obecnie pracuję, ale powinien rozwiązać ten problem.

+0

To nie jest doskonałe, ale może działać w zależności od nazw twoich klas. Rozważmy klasę 'User', która' has_one' innej klasy nazywa się 'UserAttributes'. Niestety uzyskasz dostęp do tego przez 'user.user_attributes', który zwraca wartość false do wywołania' response_to? (Assoc_name.singularize) '. Możesz argumentować (i pewnie masz rację), że powinieneś zmienić nazwę tej klasy "UserAttributeSet" lub coś podobnego, w którym to przypadku zadziała "singularize", ale nie ma gwarancji, że otrzymasz poprawny typ powiązania właśnie przez to, czy nazwa instancji jest pojedyncza lub mnoga. – pariser

+0

Cóż, posiadanie nazwy modelu w liczbie mnogiej byłoby sprzeczne z konwencją nazewnictwa Railsów (http://itsignals.cascadia.com.au/?p=7), więc nigdy nie powinieneś mieć modelu UserAttributes. Zawsze powinna to być UserAttribute. Liczba pojedyncza lub mnoga powinna odzwierciedlać związek has_one lub has_many. Wszelkie inne obawy powinny być rozpatrywane w sposób, w jaki logika zaczyna od początku. – MCB

+0

Rzeczywiście masz rację - oto lepszy sposób na wykazanie, że nie obejmuje to każdego przypadku: Rozważ model "Fish", w którym nazwa asocjacyjna '" fish "' jest niepoliczalna. Oznacza to, że słowo "ryba" to zarówno forma w liczbie pojedynczej, jak i mnogiej rzeczownika (np. "Ryba" .singularize == "ryba" .pluralizacja "), więc przez to nie wiesz, czy model' has_one : fish' or 'has_many: fish'. – pariser