Ich frage mich, was die einfachste/eleganteste Art der Auswahl von Attributen aus Join-Modellen in has_many: durch Assoziationen ist.Elegant Auswahl von Attributen aus has_many: durch Join-Modelle in Rails
Können sagen, wir haben Angebote, Kataloge und CatalogItems mit der folgenden Item-Klasse:
class Item < ActiveRecord::Base
has_many :catalog_items
has_many :catalogs, :through => :catalog_items
end
Zusätzlich können sagen, dass CatalogueItems eine Position Attribut hat und dass es nur eine CatalogueItem zwischen jedem Katalog und jedes Element .
Die naheliegendste, aber etwas frustrierend Art und Weise die Position Attribut abzurufen ist:
@item = Item.find(4)
@catalog = @item.catalogs.first
@cat_item = @item.catalog_items.first(:conditions => {:catalog_id => @catalog.id})
position = @cat_item.position
Das ist ärgerlich, weil es, dass wir scheint in der Lage sein sollte @ item.catalogs.first.position zu tun, da wir komplett haben spezifiziert, welche Position wir haben wollen: diejenige, die dem ersten von @ items Katalogen entspricht.
Der einzige Weg, die ich gefunden habe, dieses zu erhalten ist:
class Item < ActiveRecord::Base
has_many :catalog_items
has_many :catalogs, :through => :catalog_items, :select => "catalogue_items.position, catalogs.*"
end
Jetzt habe ich Item.catalogs.first.position tun kann. Dies scheint jedoch ein bisschen wie ein Hack zu sein - ich füge ein zusätzliches Attribut zu einer Catalog-Instanz hinzu. Es eröffnet auch die Möglichkeit, eine Ansicht in zwei verschiedenen Situationen zu verwenden, in denen ich @ Catalogs mit einer Catalog.find oder mit einem @ item.catalogs bevölkert. In einem Fall wird die Position vorhanden sein und in der anderen nicht.
Hat jemand eine gute Lösung dafür?
Danke.
Die Instanz-Methode funktioniert, aber es scheint immer noch so, als sollte es einen besseren Weg geben. Ich wollte den ersten Katalog nicht speziell, ich habe ihn nur als Beispiel benutzt. Ich denke du könntest @ item.position_in_catalog (catalog_id) machen. – arjun
Ja, es ist wirklich einfach, es für @ otem.position_in_catalog (Katalog) umzuschreiben. Ich sehe jedoch keinen anderen Weg, wie Sie das umsetzen können, was Sie wollen. –
@ item.catalogs.first.position <- dies gibt keine Position an. Mit @ item.catalogs geben Sie nur eine Teilmenge aller Kataloge an, aus der Sie dann die erste auswählen.Also, was Sie am Ende haben, ist nur ein Katalog, der agnostisch über die Art und Weise, wie Sie es erhalten haben, ist. –