Rails 4分组重复

时间:2016-05-01 20:40:07

标签: ruby-on-rails ruby postgresql

我不知道如何提出这个问题。我是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。

我错过了什么?

1 个答案:

答案 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只是根据它在数据和制造对象中返回任何行。