这是一个初学者的问题,但出于某种原因,我无法在其他地方找到答案。
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类的客户订单数量?
最后一个问题:@ orders.find_all_by_x(...)为什么不工作?
答案 0 :(得分: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提供了一个finder方法。例如,如果您的客户端模型上有一个名为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")
答案 1 :(得分:0)
1)显示客户的所有OrderItem
您可以向客户添加名为“order_items”的关系,如下所示:
has_many :order_items, :through => :orders
然后你可以这样做:
customer = Customer.find(:first)
order_items = customer.order_items
要查找所有未读的OrderItems(其中read == false),您可以将named_scope添加到OrderItem:
named_scope :unread, :conditions => {:read => false}
然后,您可以通过以下方式找到一位客户的所有未读OrderItem:
customer.order_items.unread
2)显示属于给定类别的客户的所有OrderItem
同样,OrderItem中的一个命名范围(我假设OrderItem属于一个类别):
named_scope :in_category, lambda { |name|
{:conditions => {:categories => {:name => name}}, :include => :category}
}
两个注释:
您必须在条件中包含:类别
即使它的belongs_to:category(单数),你必须使用:categories(复数)。这是因为:include将表格添加为复数。 (我不知道为什么会这样,对我而言,这似乎暗示这不是最佳解决方案。)
最后一个问题:@ orders.find_all_by_x(...)为什么不工作?
这确实对我有用。您收到了什么错误消息?