使用控制器/视图中的嵌套信息

时间:2010-08-08 03:16:40

标签: ruby-on-rails variables hash

这是一个初学者的问题,但出于某种原因,我无法在其他地方找到答案。

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(...)为什么不工作?

2 个答案:

答案 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}
}

两个注释:

  1. 您必须在条件中包含:类别

  2. 即使它的belongs_to:category(单数),你必须使用:categories(复数)。这是因为:include将表格添加为复数。 (我不知道为什么会这样,对我而言,这似乎暗示这不是最佳解决方案。)

  3.   

    最后一个问题:@ orders.find_all_by_x(...)为什么不工作?

    这确实对我有用。您收到了什么错误消息?