Rails has_many, найди только тех, у кого есть дети - PullRequest
7 голосов
/ 25 марта 2011

Моя таблица "продукты" has_many :istered_products.

Я хочу использовать что-то вроде

products.find(:has_registered_products) 

, где будут возвращаться только продукты, которые также имеют запись в таблицеistered_products. Как мне этого добиться?

Ответы [ 5 ]

11 голосов
/ 25 марта 2011

Пока у вас есть посторонний ключ для продукта в таблице зарегистрированной продукции, вы можете сделать:

has_many :registered_products
named_scope :with_registered_products, :joins => :registered_products

# if you're using rails 3
scope :with_registered_products, joins(:registered_products)

и будут возвращены только продукты, имеющие хотя бы один зарегистрированный зарегистрированный продукт.

4 голосов
/ 04 марта 2014

Это справится с дублированием.

Product.joins(:registered_products).uniq
1 голос
/ 23 мая 2013

Как отмечает Якоб, если имеется несколько дочерних записей, вам необходимо убедиться, что вы не возвращаете несколько родительских объектов.

Использование «Выбрать отличное» будет работать, но оператор выбора может помешать, когда эта область сочетается с другими областями.

Другой вариант - обеспечить присоединение к дочерней таблице, в которой есть только уникальные записи.Вы можете сделать это, составив ваше объединение следующим образом

class Product < ActiveRecord::Base
 has_many registered_products

 scope :with_registered_products, joins('join (select distinct product_id from registered_products) rp123456 on rp123456.product_id = products.id')
end
0 голосов
/ 25 марта 2011

Вы можете использовать counter_cache (http://railscasts.com/episodes/23-counter-cache-column). Это должно быть быстрее, чем на самом деле объединение, просто чтобы выяснить, есть ли дочерние элементы.

0 голосов
/ 25 марта 2011
class Product
  has_many :registered_products
end

Список продуктов (по крайней мере, с одним зарегистрированным продуктом) - Загруженные зарегистрированные продукты

Product.all(:include => :registered_products, 
  :conditions => "registered_products.id IS NULL")

Список продуктов (по крайней мере, с одним зарегистрированным продуктом) - Без активной загрузки

Product.all(:joins => :registered_products)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...