我有两个模型:
model User id:integer name:string
model Item id:integer name:string
执行功能的最佳方法是什么:
所有用户都可以查看所有项目。当前用户可以“隐藏项目”。然后该项目不显示,但显示给没有隐藏项目的用户。
我有两个模型:
model User id:integer name:string
model Item id:integer name:string
执行功能的最佳方法是什么:
所有用户都可以查看所有项目。当前用户可以“隐藏项目”。然后该项目不显示,但显示给没有隐藏项目的用户。
您需要一个辅助模型来处理单个项目的“隐藏”逻辑。以下代码说明了如何使用子查询执行此操作:
class HiddenItem < ActiveRecord::Base
belongs_to :user
belongs_to :item
end
class Item < ActiveRecord::Base
has_many :hidden_items
def self.visible_for_user(user)
subquery = user.hidden_items.select("hidden_items.item_id").to_sql
where("items.id NOT IN (#{subquery})")
end
end
class User < ActiveRecord::Base
has_many :hidden_items
def visible_items
Item.visible_for_user(self)
end
end
现在您可以获取用户的非隐藏项:
user = User.find(1)
user.visible_items
如果你想隐藏一个项目,你可以这样做:
user.hidden_items.create(item_id: item.id)