Rails - запрос ассоциации has_many - PullRequest
0 голосов
/ 24 мая 2018

У меня проблемы с запросом ассоциации has_many.Контекст магазинов.

class Store < ActiveRecord::Base
  has_many :items
end

class Item < ActiveRecord::Base
  belongs_to: store
end

Таблица магазинов:

id  name
1   Macys
2   Target
3   Dillards

Таблица элементов:

id  store_id    name
1   1           pants
2   1           shirt
3   2           pants
4   2           shirt
5   3           shirt

Я пытаюсь сделать запрос о магазинах, которые продают только рубашки.Поэтому мне нужен запрос, который возвращает запись store с id из 3.

Когда я попытался сделать

Store.includes(:items).where(
  items: { name: %w(shirts)} ).references(:items)

, он возвращает store_ids 1, 2,и 3 (все магазины), потому что у них всех есть рубашки.

Ответы [ 4 ]

0 голосов
/ 24 мая 2018

Я закончил, используя:

Store.joins(:items).group('items.store_id').having("max(items.name) = 
  min(items.name) and min(items.name) = 'shirt'")
0 голосов
/ 24 мая 2018

В вашей Item модели вам нужно установить counter_cache:

belongs_to :store, counter_cache: true

, тогда ваш запрос будет:

Store.joins(:items).where('items_count = ? AND items.name = ?', 1, 'shirt')
0 голосов
/ 24 мая 2018

Один из способов сделать это, как упомянуто в посте, который хранит только вещи в виде рубашек, будет:

Store.joins(:item).where("items.name = ?", 'shirt').where.not(item_name: Item.where("items.name != ?", "shirt"))

Надеюсь, это поможет !!

0 голосов
/ 24 мая 2018
Store.includes(:items)
  .where(items: { name: 'shirt' })
  .where.not(id:
    Item.where.not(name: 'shirt').select(:store_id)
  )

Надеюсь, есть лучший способ ... (если кто-нибудь)

...