我试图实施某种" 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)
当练习名称作为搜索查询输入时,我得到正确的对象结构,但如果我使用用户的名称作为搜索参数 - 我只能在练习中看到这个特定的用户,我希望能够在这种情况下,让所有活跃的用户都参与到实践中。
你能帮我弄清楚如何实现这个目标吗?
提前谢谢!
答案 0 :(得分:0)
尝试添加条件关联:
has_many :active_users, -> {where(active: true)}, class_name: "User"
然后同时使用includes
和references
Practice.includes(:active_users).references(:users)...
这适用于Rails 4。