Rails-проверить, существует ли запись В имеет много ассоциаций


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

У меня есть три модели: 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 операторы в моих представлениях элементов, но вот подвох, user_items имеют enum status: [ :pending, approved]. Поэтому мне нужно посмотреть, есть ли у current_user определенный элемент :pending.

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

3 7

3 ответа:

Попробуйте:

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

Или

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

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

Я думаю, что вы упускаете из виду методы моделирования. Например, если вы добавили метод в модель элементов с именем 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

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? 
  ...