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

标签 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 匹配或 @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/

相关文章:

sql - jOOQ - CTE 和 INSERT

ruby-on-rails - Rails 协会。它们是如何工作的?

ruby-on-rails - 没有这样的文件或目录@rb_sysopen - tmp/pids/puma.pid

ruby - RDiscount :generate_toc with Sinatra

ruby-on-rails - 无方法错误 : undefined method `created_at' for in Rails

mysql - 如何加入需要重复的地方?

sql - 选择带有修剪行的计数

SQL Server : calculate monthly total sales incl empty months

ruby-on-rails - 更改 bundle 安装 Ruby 版本

ruby-on-rails - 如何制作正则表达式来匹配所有互联网域(无论扩展名如何)