Rails - проверить, существует ли запись в has_many ассоциации

Я не уверен, правильно ли сформулирован мой вопрос.

У меня есть три модели: User, Item и UserItem.

user has_many :user_items
user has_many :items, through :user_items

item has_many :user_items
item has_many :users -> {uniq}, through :user_items
item belongs_to :user

user_item belongs_to :user
user_item belongs_to :item

Мне нужно выяснить, есть ли у пользователя элемент для создания операторов if в представлениях моих позиций. Но здесь catch, user_items имеют enum status: [ :pending, approved]. Поэтому мне нужно увидеть, есть ли current_user элемент :pending.

Например, когда пользователь посещает страницу просмотра item1, у меня появляется действие show_controller show declare @item = Item.find_by_id(params[:id]). Но что я могу сделать с этим @item, чтобы узнать, есть ли у пользователя этот элемент?

Ответ 1

Try:

current_user.items.exists?(params[:id])

Или

current_user.items.exists?(@item.id)

Ответ 2

Но что же мне делать с этим @item, чтобы узнать, есть ли у пользователя этот элемент?

Я думаю, что вам не хватает здесь модельных методов. Например, если вы добавили метод в модель Item с именем belongs_to_user_in_pending_state, вы могли бы вызвать @item.belongs_to_user_in_pending_state(current_user) в любом месте, где это необходимо.

def belongs_to_user_in_pending_state(user)
  if self.user_items.pending.select {|s| s.user == user}.count > 0 
    return true
  else
    return false
  end
end

Ответ 3

Расширяя @lei-liu ответ здесь. Можно найти, существует ли запись среди множества, с помощью: current_user.items.exists?(params[:id])

В то же время exists? позволяет фильтровать по столбцам помимо id, а также учитывает более сложные условия, такие как следующие:

current_user.items.exists?('id > 3')
current_user.items.exists?(name: 'some_name')

Ответ 4

1) Добавить область в класс User_item

scope :pending, -> {where status: 'pending'}

2) Используйте эту область в методе экземпляра класса Item:

def is_pending_with_someone?
  self.user_items.pending.count > 0
end

Затем вы можете использовать

if @item.is_pending_with_someone? 
  ...