使用activerecord获取正确的用户

时间:2015-10-27 19:54:32

标签: ruby-on-rails activerecord

目前,我有一个我要搜索的10,000个用户的表。我还有另一个我已经批准的3个用户的表。我想这样做,以便搜索结果只返回9997个用户。换句话说,如果我批准了用户,我不希望它们出现在搜索结果中。以下是我到目前为止的代码:

approved_users = Approval.where(user_id: logged_in_user.id) 
approved_user_ids = approved_users.map { |user| user.approved_user_id}
pre_search_results = User.find_by_sql("SELECT *
  FROM users LEFT JOIN approvals
  ON users.id = approvals.approved_user_id
  WHERE name LIKE ? OR operator_id LIKE ?"
  )

当我手动添加3个用户时,第一个语句approved_users会返回此信息:

id: 10, user_id: 39, approved_user_id: 37
id: 11, user_id: 39, approved_user_id: 35>,
id: 12, user_id: 39, approved_user_id: 41>

然后我让approved_user_ids给我上面语句的id部分,所以它返回:

[37, 35, 41]

现在,我希望pre_search_results将9997其他用户归还给我,我有上述声明。它目前没有返回任何内容。有什么想法可以做些什么?

2 个答案:

答案 0 :(得分:0)

要让approved_user_ids中不存在ID的所有用户,您可以使用:pre_search_results = User.where("id NOT IN (?)", approved_user_ids)

答案 1 :(得分:0)

我的想法是将你的两个不同的条件分成两个不同的范围,然后可以将它们链接在一起......

我还假设您的User模型中存在关系。

<强> user.rb

class User
  has_many :approvals

  scope :has_been_approved, -> { joins(:approvals) }
  scope :has_not_been_approved, -> ( includes(:approval).where(approvals: { user_id: nil })
  scope :search_by_name, ->(term) { where("name LIKE :t", t: term) }

...它可以让您在控制器(或任何地方)执行某些操作,例如......

User.has_not_been_approved.search_by_name("Rodolfo")

has_not_been_approved的范围有点尴尬。我在这里找到了示例:Rails find record with zero has many records associated