2009-01-09 30 views
5

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.

Trả lời

0

Bạn có thể làm một cái gì đó như thế này:

# which is basically same as your "frustrating way" of doing it 
@item.catalog_items.find_by_catalogue_id(@item.catalogs.first.id).position 

Hoặc bạn có thể quấn nó vào trong một phương pháp thể hiện của mô hình Item:

def position_in_first_catalogue 
    self.catalog_items.find_by_catalogue_id(self.catalogs.first.id).position 
end 

và sau đó chỉ cần gọi nó như thế này:

@item.position_in_first_catalogue 
+1

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

+0

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. –

+0

@ 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ó. –

-1

Bạn có thể làm @ catalog.catalog_item.position nếu bạn cung cấp đầu kia của liên kết.

class Catalog < ActiveRecord::Base 
    belongs_to :catalog_item 
end 

Bây giờ bạn có thể làm Catalog.first.catalog_item.position.

+0

Danh mục has_many catalog_items và has_many các mặt hàng thông qua catalog_items, vì vậy đây không phải là những gì tôi đang tìm kiếm..thanks mặc dù. – arjun

+0

Điều này sẽ không làm việc cho mối quan hệ nhiều-nhiều được thể hiện bởi has_many: thông qua. –

-2

Tại sao không Bạn chỉ

@item = Item.find(4) 
position = @item.catalog_items.first.position 

tại sao bạn đi qua catalog? Nó không có ý nghĩa gì với tôi vì bạn đang tìm kiếm danh mục BẤT CỨ đầu tiên !?

+0

Tôi không chắc chắn ý của bạn là "danh mục BẤT CỨ đầu tiên". Dù sao, tôi không thường xuyên tìm kiếm danh mục đầu tiên - đó chỉ là một ví dụ. Nói rằng một mục có 50 danh mục và tôi muốn vị trí của mục trong danh mụC# 6823 .. – arjun

+0

Ý tôi là, có vẻ như bạn chỉ cần vị trí đầu tiên từ catalog_items cho mục hiện tại và danh mục sản phẩm là không cần thiết cho truy vấn này. – aivarsak

+0

Bạn không biết WHICH vị trí bạn muốn từ catalog_items. Nếu một mục thuộc về 50 danh mục và bạn muốn vị trí của nó trong danh mục thứ 47 (nhưng không biết thứ tự các danh mục có trong đó) thì bạn cần danh mục. – arjun

Các vấn đề liên quan