Rails在ActiveRecord :: Relation中使用OR进行搜索

时间:2011-10-03 22:41:05

标签: sql ruby-on-rails ruby ruby-on-rails-3 activerecord

经过长时间的搜索,我终于问了这个问题: 如何在Rails 3.0中使用ActiveRecord :: Relation进行OR条件查询?基本上我认为它必须与范围和东西做点什么......

这就是我所拥有的:

class Practice < ActiveRecord::Base
  attr_accessible :name

  has_and_belongs_to_many :doctors
  has_and_belongs_to_many :services
end

class Doctor < ActiveRecord::Base
  attr_accessible :first_name, :last_name

  has_and_belongs_to_many :practices
  has_and_belongs_to_many :services
end

class Service < ActiveRecord::Base
  attr_accessible :name, :about

  has_and_belongs_to_many :practices
  has_and_belongs_to_many :doctors
end

我想要实现的是一个表单,我可以在其中执行搜索查询并获取ActiveRecord :: Relation对象(因此我可以将其与will_paginate一起使用等)与实践列表。查询应该找到任何练习,其中@ practice.name匹配query_string或其中@ practice.doctors.first_names匹配query_string OR其中@ practice.doctors.last_names匹配query_string或@ practice.services.names匹配query_string。换句话说 - 假设query_string匹配服务的名称,我想找回与此服务相关的实践列表。或者,如果Doctor的first_name或last_name与query_string匹配,那么我会获得与此Doctor / Doctors相关联的实践。当然还有练习名称的旧比赛:D

我意识到我的has_and_belongs_to_many协会在这里并不好,这只是为了演示目的,但我很乐意听到有人可以为我的案例提供迁移和协会帮助。

感谢。

P.S。正如我所说,我使用Rails 3.0,我相信它必须对范围做一些事情(但我当然可能是错的)。我也试过MetaWhere但是无法使它工作.... :(

2 个答案:

答案 0 :(得分:3)

让我们看看结果如何:

class Practice < ActiveRecord::Base
  class < self
    def by_any_name(param)
      joins(:doctors, :services).
      where(<<-SQL, :name => param)
             doctors.first_name = :name OR
             doctors.last_name  = :name OR
             practices.name     = :name OR
             services.name      = :name
      SQL
    end
  end
end

范围所以去年。

还有一些人加入了(需要测试!):

joins('LEFT JOIN
         (doctors_practices INNER JOIN doctors
            ON doctors.id = doctors_practices.doctors_id)
          ON doctors_practices.practice_id = practices.id
       LEFT JOIN
         (practices_services INNER JOIN services
            ON services.id = practices_services.service_id)
          ON practices_services.practice_id = practices.id')

Sheesh,经过我的睡觉时间。

答案 1 :(得分:0)

你可以深入了解ARel 或者 - 看看我在那里做了什么:) - 看看非常方便的宝石吱吱声,它可以让你用一个很好的语法完成你想要的。

https://github.com/ernie/squeel