我有一个用户和项目表。我想要的是一种获取特定用户尚未完成的所有项目的方法。我将如何有效地以惯用的Rails方式解决这个问题?我在考虑创建一个名为useritems的新表,其中包含user_id和item_id列。我认为这是正确的方法,但我不确定如何实际获得用户不完整的项目。什么是正确的activerecord语法?
谢谢!
答案 0 :(得分:1)
UserItem是连接表。您可以为:complete
class User < ActiveRecord
has_many :items, through: :user_items
scope :incomplete, -> { joins(:user_items).where('user_items.complete = ?', false) }
end
class Item < ActiveRecord
has_many :users, through: :user_items
end
class UserItem < ActiveRecord
belongs_to :user
belongs_to :item
end
你的代码可能是这样的:
User.find(x).incomplete
嗯..你可能要做一些更像......的事情。
User.find(x).incomplete.items
我没有测试过这个......
如果该范围不起作用..也许可以尝试外部联接..再次,只是猜测:
scope :incomplete, joins('left outer join user_items on user.id=user_items.user_id').where('user_items.complete is ?', [nil, false])
答案 1 :(得分:1)
@trip
的答案是正确的,要详细说明您如何找到不完整的项目,您需要执行以下操作:
<强>加入强>
如果您有联接模型,则只需记录与用户交互/完成的UserItem
(为了提高效率)。要查找未完成的项目,我会将已完成的项目与整个项目列表进行比较:
#app/models/user.rb
Class User < ActiveRecord::Base
has_many :user_items
has_many :items, through: :user_items
def incomplete_items
target = self.items
return Item.all.where('id != ?', target)
end
end
#user_items
id | user_id | item_id | created_at | updated_at
这样您就可以致电@user = User.incomplete_items
以获取未包含在user_items
加入模式