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

时间:2014-04-24 08:00:33

标签: ruby-on-rails activerecord

我有一个用户和项目表。我想要的是一种获取特定用户尚未完成的所有项目的方法。我将如何有效地以惯用的Rails方式解决这个问题?我在考虑创建一个名为useritems的新表,其中包含user_id和item_id列。我认为这是正确的方法,但我不确定如何实际获得用户不完整的项目。什么是正确的activerecord语法?

谢谢!

2 个答案:

答案 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加入模式

中的项目列表