0

Быстрый вопрос:Rails 4: логические модели

У меня есть модель, которая включает FavoriteItem :id :user_id :item_id

Как я могу проверить в цикле через все Items

- @items.each do |item| 

... если current_user понравился товар?

=> Для примера:

запись
current_user.id == 243 
item.id == 53 

Эта БД существует в FavoriteItems:

:id => 1, :user_id => 243, :item_id => 53 

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

Я благодарен за вашу помощь! Скажите, если вам нужна дополнительная информация.

ответ

4

Вы должны быть в состоянии сделать это за один вызов базы данных:

item.favorited_items.where(:user_id => current_user).exists? 

Можно также обернуть, что в способе по Item:

def favorited_by?(user) 
    favorited_items.where(:user_id => user).exists? 
end 

, а затем сказать item.favorited_by?(current_user) в цикле ,

Если вы перебираете большое количество items, вы можете прекомпотировать фаворитов текущего пользователя, чтобы избежать n + 1 запросов.

1

Вы можете сделать это с map и include?

@items.each do |item| 
    if item.favorited_items.map(&:user_id).include?(current_user.id) 
    # yep, there's a match - do something 
    end 
end 

Если вы собираетесь использовать эту функциональность много, то вы, вероятно, хотите, чтобы создать область на модели элементов.

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