经过长时间的搜索,我终于问了这个问题: 如何在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但是无法使它工作.... :(
答案 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 或者 - 看看我在那里做了什么:) - 看看非常方便的宝石吱吱声,它可以让你用一个很好的语法完成你想要的。