2016-05-01 4 views
0

Я не был уверен, как задать этот вопрос. Я новичок в Ruby on Rails и все еще понимаю, как собрать все вместе.Rails 4 дублирующих группы

У меня есть книги, заказы, продукты и пользователи. В определенном представлении я хотел бы отображать один 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 по порядку, но когда я добавляю: created_at (@orders = Order.select(:product_id, :created_at).distinct) в запрос выбора, я получаю дубликат: product_ids.

Что мне не хватает?

ответ

0

Ну, вам нужно подумать о том, как это будет выглядеть. Когда вы выбираете строки отдельным product_id, вы отбрасываете все остальные строки заказов, у которых одинаковые product_id. Но когда вы добавите created_at обратно в микс, ваш результирующий набор будет содержать тот же product_id, потому что distinct действует против кортежа (product_id, created_at), а не только product_id.

Ваши оригинальные @orders на самом деле не все ваши заказы, это всего лишь подмножество, потому что оно выбрало уникальный по product_id.

Я считаю полезным, чтобы добавить to_sql в конце запроса, чтобы увидеть, что фактический SQL выходит из ActiveRecord делает:

> 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 просто принимает любые строки, возвращаемые в данные и производственные объекты на основе этого.

+0

Это имеет большой смысл. Спасибо. Есть ли у вас рекомендация, чтобы это нормально работало? Может быть, я ошибаюсь. – jgrant

Смежные вопросы