Как написать запрос, который получает только объект, ассоциация которого не пуста - PullRequest
0 голосов
/ 29 марта 2019

У меня есть 3 модели:

 Product
 has_many :variants

 Variant
 has_many :stocks
 belongs_to :product

 Stock
 belongs_to :variant

Мне нужно получить Вариант , где Запас не пусто

Я пробовал таким образомно это не работает, как ожидалось ... так как оно пустое, оно не равно нулю ...

 @product.variants.includes(:stocks).where.not(stocks: nil)

Ответы [ 2 ]

1 голос
/ 30 марта 2019

Более простая версия того, что вы сделали .... использование Имеет множество ассоциативных ссылок

и в моем контроллере продукта

def show
  @product_size_options = []    
  @product.variants.map do |var| 
     ##this will make sure that only persisted stocks comes out
      if var.stock_ids.size > 0
        @product_size_options  << var
      end
    end
 end

Приведенный выше код также может быть записан в одну строку =>

@product.variants.map { |var| var if var.stock_ids.size > 0 }.compact.flatten

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

0 голосов
/ 29 марта 2019

Я нашел рабочее решение по-другому:

В моей модели Variant

def has_stock
   self.stocks.empty? ? false : true
end

и в моем контроллере продукта

def show
  @product_size_options = []    
  @product.variants.map do |var| 
      if var.has_stock == true
        @product_size_options  << var
      end
    end
 end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...