Ruby on rails 检查用户是否与项目进行了交互

Ruby on rails 检查用户是否与项目进行了交互,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有一个用于用户和项目的表。我想要的是一种获取特定用户尚未完成的所有项目的方法。我将如何以惯用的Rails方式高效地进行此操作?我正在考虑创建一个名为useritems的新表,该表具有user\u id和item\u id列。我认为这是一种正确的方法,但我不确定如何获得用户的未完成项目。什么是正确的activerecord语法 谢谢 Well UserItem是联接表。您还可以为:complete class User < ActiveRecord has_many :items, t

我有一个用于用户和项目的表。我想要的是一种获取特定用户尚未完成的所有项目的方法。我将如何以惯用的Rails方式高效地进行此操作?我正在考虑创建一个名为useritems的新表,该表具有user\u id和item\u id列。我认为这是一种正确的方法,但我不确定如何获得用户的未完成项目。什么是正确的activerecord语法


谢谢

Well 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.items
我没有测试这个


如果这个范围不起作用。。也许可以尝试外部连接。。再说一次,只是猜测:

scope :incomplete, joins('left outer join user_items on user.id=user_items.user_id').where('user_items.complete is ?', [nil, false])

@trip
的答案是正确的,要详细说明如何找到未完成的项目,您需要执行以下操作:


加入

如果您有一个连接模型,您只需要记录与用户交互/完成的
UserItem
s(为了提高效率)。要查找未完成的项目,我会将已完成的项目与整个项目列表进行比较:

#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
#app/models/user.rb
类用户

这将允许您调用
@user=user。不完整的\u项目
以获取未包含在您的
用户\u项目
加入模型中的项目列表

该项目属于多个用户还是每个用户都有自己的项目。用户何时以及如何完成该项目?项目有一个创建它的用户,但理想情况下我希望所有用户都参与要完成所有项目迄今为止,我所采用的方法是,每当用户完成某项任务时,我就在联接表中创建一项。这是错误的方法吗?我不完全理解目标是如何工作的。
id!=目标
工作?哦,等等,我现在明白了。这是有道理的!如果这些表很大,那么它仍然可以正常运行吗?可能不会-这就是为什么我总是尝试将这种东西放在那里(这更像是一种想法,而不是一种经过验证的方法)。这就是我要开始的地方——如果你得到了结果,你可以重构以提高效率!我只是用我的代码来做这个!!谢谢你这么有钱!但有一件事是有一个小的打字错误。行应该是
return Item.all.where('id!=',target)
我相信。
#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