经过很长时间的搜索,我终于问这个问题: 如何在 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 匹配或 @practice.doctors.last_names 与 query_string 匹配或 @practice.services.names 与 query_string 匹配的 Practice。换句话说 - 假设 query_string 与服务名称匹配,我想获取与该服务相关的实践列表。或者,如果医生的名字或姓氏与查询字符串匹配,那么我会得到与该医生相关的实践。当然,还有 Practice.name 的精彩老比赛:D
我意识到我的 has_and_belongs_to_many 关联在这里并不好,这只是为了演示目的,但我很高兴听到是否有人可以帮助我的案例进行迁移和关联。
谢谢。
附注正如我所说,我使用 Rails 3.0,并且我相信它必须对范围做一些事情(但我当然可能是错的)。我也尝试过 MetaWhere 但无法使其工作......:(
最佳答案
让我们看看结果如何:
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')
天哪,已经过了我的 sleep 时间了。
关于sql - Rails 在 ActiveRecord::Relation 中使用 OR 进行搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7641495/