問題描述
Rails ‑ 檢查 has_many 關聯中是否存在記錄 (Rails ‑ check if record exists in has_many association)
我不確定我的問題措辭是否正確。
我有三個模型: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 有 枚舉狀態:[:pending,approved]
。所以我需要查看 current_user
是否有某個 :pending
項目。
例如,當用戶訪問 item1 的查看頁面時,我有 item_controller 的顯示動作聲明 @item = Item.find_by_id(params[:id])
。但是我可以用這個 @item
做什麼來查看用戶是否有這個項目?
參考解法
方法 1:
Try:
current_user.items.exists?(params[:id])
Or
current_user.items.exists?(@item.id)
方法 2:
Extending @lei‑liu's answer here. One can find if the record exists among the many or not, through: current_user.items.exists?(params[:id])
At the same time, exists?
allows one to filter through the columns besides id
, and also allows for more complicated conditions, like the following:
current_user.items.exists?('id > 3')
current_user.items.exists?(name: 'some_name')
方法 3:
But then what can I do with this @item to see if a user has this item?
I think what you are missing here is model methods. For example, if you added a method to the Item model called belongs_to_user_in_pending_state, you'd be able to call @item.belongs_to_user_in_pending_state(current_user)
anywhere you need it.
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
(by user4584963、lei liu、Arslan Ali、tkz79)