2010-08-08 65 views
1

這是一個初學者的問題,但由於某種原因,我無法在別處找到答案。在控制器/視圖中使用嵌套信息

Customer has_many orders 
Order has_many order_items 

我在customer/show.html.erb中,我希望我的客戶操縱order_items。

許多訂單都有很多order_items,我想搜索所有這些order_items以找到那些read == false的。

#controller 
@customer = Customer.find(params[:id]) 
@orders = @customer.orders 

@order_items = @ orders.order_items不起作用。鑑於@orders中有多個項目,我如何收集屬於@orders的所有order_items?

===編輯===

我的整個數據庫的結構是表的複雜大組,我需要遍歷該樹爲這個特定視圖。

customer has_many orders 
orders has_many order_items 
order_items belongs_to category 

例如,我如何找到屬於類別X的我的客戶的order_items的數量?

最後一個問題:爲什麼不@ orders.find_all_by_x(...)工作?

回答

0

1)顯示所有的OrderItems爲客戶

可以稱爲 「ORDER_ITEMS」 的關係添加到您的客戶是這樣的:

has_many :order_items, :through => :orders 

然後你可以這樣做:

customer = Customer.find(:first) 
order_items = customer.order_items 

要查找所有未讀的OrderItems(其中閱讀==假的),你可以在named_scope添加到您的OrderItem的:由

named_scope :unread, :conditions => {:read => false} 

然後你可以找到所有未讀的OrderItems一個客戶:

customer.order_items.unread 

2)顯示屬於特定類別

又一個客戶的所有的OrderItems,在OrderItem的名爲範圍(我假設OrderItem的belongs_to的範疇):

named_scope :in_category, lambda { |name| 
    {:conditions => {:categories => {:name => name}}, :include => :category} 
} 

札記二

  1. 你必須包括:類別的conditon

  2. 即使它belongs_to的:類(單數),您必須使用:類別(複數)。這是因爲:include將表格添加爲複數。 (我不知道爲什麼這樣做,對我來說這似乎是一個提示,這不是最好的解決方案。)

最後一個問題:爲什麼不@ orders.find_all_by_x(。 ..)工作?

這樣確實如預期的我。你收到什麼錯誤信息?

+0

爲第1部分:當客戶的has_many:ORDER_ITEMS,:通過=>:訂單,我不能說OrderItem has_many:customers,:through =>:orders。我的訂單表格當然只有customer_id而不是order_item id。你可以通過單向has_many嗎? – sscirrus 2010-08-08 19:13:25

+0

也許你需要HAS_ONE:通過 – Bohdan 2010-08-09 03:46:07

+0

@sscirrus: 博赫丹是正確的,你可以使用HAS_ONE:客戶:通過=>:訂單 – Calavera 2010-08-09 10:29:03

0

@orders = @customer.orders給你的ActiveRecord的集合對象,則不能調用對象的這個收集方法,您應該使用each迭代

#controller 
@customer = Customer.find(params[:id]) 
@orders = @customer.orders 
list = Array.new() 
@orders.each do |order| 
    //some your action(something like order.order_items) 
    //you may add some condition here 
    order.order_items.each do |item| 
    list << item 
    end 
end 

現在搜索我不是舒爾約count,但它可能工作

OrderItem.find(:all,:conditions => {:category_id => "1"}).count //if you know category id 

OrderItem.all :joins => :categories, :conditions => {:categories => {:name => "X"}} //name is column in your table which holds category name 

和最後一個

對於您在表中定義的每個字段(也稱爲屬性),Active Record都提供了查找方法。例如,如果您在客戶端模型上有一個名爲name的字段,則可以從Active Record中免費獲取find_by_name和find_all_by_name。如果您在客戶端模型上也有一個鎖定的字段,您還會得到find_by_locked和find_all_by_locked。

你不能叫@orders.find_all_by_x(...)但你可以叫Category.find_all_by_name("X")

+0

嗨Bohdan, 我會使用.each,除了我需要所有的order_items在一起,所以我可以對它們進行排序......使用.each自然約束排序。 – sscirrus 2010-08-08 20:03:02

+0

如果你定義收集所有你應該使用操作符<< – Bohdan 2010-08-09 03:32:05

+0

您可以寫信甚至列表<< order.order_items但後來你會得到其他結果 – Bohdan 2010-08-09 03:42:33

相關問題