Tôi tự hỏi cách lựa chọn các thuộc tính dễ dàng/thanh lịch nhất từ các mô hình kết nối trong has_many là gì: thông qua các kết hợp.Lựa chọn các thuộc tính một cách tao nhã từ has_many: thông qua các mô hình tham gia trong Rails
phép nói rằng chúng tôi có Items, Catalogs, và CatalogItems với Item lớp sau:
class Item < ActiveRecord::Base
has_many :catalog_items
has_many :catalogs, :through => :catalog_items
end
Thêm vào đó, cho phép nói rằng CatalogueItems có một thuộc tính vị trí và rằng chỉ có một CatalogueItem giữa bất kỳ danh mục và bất kỳ mục nào .
Cách rõ ràng nhất nhưng hơi bực bội để lấy thuộc tính vị trí là:
@item = Item.find(4)
@catalog = @item.catalogs.first
@cat_item = @item.catalog_items.first(:conditions => {:catalog_id => @catalog.id})
position = @cat_item.position
Đây là khó chịu vì nó có vẻ rằng chúng ta sẽ có thể làm @ item.catalogs.first.position vì chúng ta có hoàn toàn đã chỉ định vị trí nào chúng tôi muốn: vị trí tương ứng với danh mục đầu tiên của danh mục @ item.
Cách duy nhất tôi đã tìm thấy để có được điều này là:
class Item < ActiveRecord::Base
has_many :catalog_items
has_many :catalogs, :through => :catalog_items, :select => "catalogue_items.position, catalogs.*"
end
Bây giờ tôi có thể làm Item.catalogs.first.position. Tuy nhiên, điều này có vẻ như một chút của một hack - Tôi đang thêm một thuộc tính thêm vào một thể hiện Catalog. Nó cũng mở ra khả năng cố gắng sử dụng một khung nhìn trong hai tình huống khác nhau nơi tôi cư trú @catalogs với một Catalog.find hoặc với một @ item.catalogs. Trong một trường hợp, vị trí sẽ ở đó, và ở vị trí khác, nó sẽ không.
Có ai có giải pháp tốt cho điều này không?
Cảm ơn.
Phương pháp thể hiện hoạt động, nhưng nó vẫn có vẻ như có một cách tốt hơn. Tôi không đặc biệt muốn danh mục đầu tiên, tôi chỉ sử dụng nó làm ví dụ. Tôi đoán bạn có thể làm @ item.position_in_catalog (catalog_id). – arjun
Có, thật dễ dàng để viết lại nó cho @ otem.position_in_catalog (danh mục). Tuy nhiên, tôi không thấy bất kỳ cách nào khác như thế nào bạn có thể thực hiện những gì bạn muốn. –
@ item.catalogs.first.position <- điều này không chỉ định bất kỳ vị trí nào cả. Với @ item.catalogs bạn chỉ cần chỉ định một tập hợp con của tất cả các danh mục, từ đó bạn chọn danh mục đầu tiên.Vì vậy, những gì bạn kết thúc với chỉ là một cửa hàng, đó là bất khả tri về cách bạn thu được nó. –