ActiveRecord:使用includes()或join()进行高级查询

时间:2014-12-11 17:17:05

标签: ruby-on-rails activerecord querying

我试图实施某种" smart"使用ActiveRecord搜索。 例如,我有两个模型:用户和实践。 我想找到只有活跃用户的所有做法。

我试图通过以下方式实现这一目标:

Practice.joins(:users)
.where('LOWER(name) LIKE :search OR (LOWER(users.first_name) LIKE :search OR LOWER(users.last_name) LIKE :search)', search: "%#{params[:search].downcase}%")
.where(users: {removed_at: nil}).distinct.limit(10)

这为我提供了所有用户(活动和删除)的实践

如果我尝试其他选项(使用includes()而不是join()):

Practice.includes(:users).where('LOWER(name) LIKE :search OR (LOWER(users.first_name) LIKE :search OR LOWER(users.last_name) LIKE :search)', search: "%#{params[:search].downcase}%")
                 .where(users: {removed_at: nil}).distinct.limit(10)

当练习名称作为搜索查询输入时,我得到正确的对象结构,但如果我使用用户的名称作为搜索参数 - 我只能在练习中看到这个特定的用户,我希望能够在这种情况下,让所有活跃的用户都参与到实践中。

你能帮我弄清楚如何实现这个目标吗?

提前谢谢!

1 个答案:

答案 0 :(得分:0)

尝试添加条件关联:

has_many :active_users, -> {where(active: true)}, class_name: "User"

然后同时使用includesreferences

Practice.includes(:active_users).references(:users)...

这适用于Rails 4。