web-dev-qa-db-ja.com

Rails-has_manyアソシエーションにレコードが存在するかどうかを確認

私の質問が正しく表現されているかどうかわかりません。

UserItem、およびUserItemの3つのモデルがあります。

_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のビューページにアクセスすると、item_controllerのshowアクションで@item = Item.find_by_id(params[:id])を宣言します。しかし、ユーザーがこのアイテムを持っているかどうかを確認するには、この_@item_で何ができますか?

15
user4584963

試してください:

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

または

current_user.items.exists?(@item.id)
27
lei liu

しかし、ユーザーがこのアイテムを持っているかどうかを確認するには、この@itemで何ができますか?

ここで不足しているのは、モデルメソッドだと思います。たとえば、belongs_to_user_in_pending_stateというメソッドをItemモデルに追加した場合、必要な場所で@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
0
tkz79

@ lei-liuの答えをここに拡張します。 current_user.items.exists?(params[:id])を介して、レコードが多数の中に存在するかどうかを確認できます。

同時に、 exists?を使用すると、id以外の列をフィルタリングできます。また、次のようなより複雑な条件も許可されます。

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