我不知道如何提出这个问题。我是Ruby on Rails的新手,我还在想弄清楚如何将所有东西拼凑在一起。
我有书籍,订单,产品和用户。在特定视图中,我想为每个用户显示一个product_id - 大多数用户将多次拥有相同的product_id。
这是我的书视图。
<% @orders.each do |order| %>
<% order.product.books.each do |book| %>
<%= link_to book.title %>
<% end %>
<% end %>
在我的书籍控制器中我有
def index
@orders = Order.select(:product_id).distinct
@books = Book.page params[:page]
end
所有这些都运行良好(视图显示每个订单product_id有一个product_id,即使有重复项),直到我调用order.created_at,这会导致缺少属性错误。我知道这个错误是因为我只是在订购时请求:product_id,但是当我向select查询添加:created_at (@orders = Order.select(:product_id, :created_at).distinct)
时,我得到重复:product_ids。
我错过了什么?
答案 0 :(得分:0)
嗯,你必须考虑一下这会是什么样子。当您按不同的product_id
选择行时,您将丢弃具有相同product_id
的所有其他订单行。但是,当您将created_at
添加回混合时,结果记录集将包含相同的product_id
,因为distinct
针对(product_id, created_at)
的元组而非product_id
进行操作1}}。
您的原始@orders
实际上不是您的所有订单,只是一个子集,因为它每product_id
选择一个唯一的订单。
我发现将to_sql
附加到查询的末尾有助于查看ActiveRecord实际出现的SQL是做什么的:
> Order.select(:product_id).distinct.to_sql
=> SELECT DISTINCT "orders"."product_id" FROM "orders"
> Order.select(:product_id, :created_at).distinct.to_sql
=> SELECT DISTINCT "orders"."product_id", "orders"."created_at" FROM "orders"
尝试在数据库中运行这些数据,您将看到ActiveRecord正在使用哪些数据来构建ActiveRecord实例,并意识到ActiveRecord只是根据它在数据和制造对象中返回任何行。