Поиск Rails с помощью ИЛИ в ActiveRecord :: Relation - PullRequest
2 голосов
/ 04 октября 2011

После очень долгих поисков я наконец задаю этот вопрос: Как мне сделать запрос условий OR с ActiveRecord :: Relation в Rails 3.0? По сути, я считаю, что это как-то связано с областью видимости и прочим ....

Вот что у меня есть:

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 Другими словами - скажем, строка запроса соответствует имени Сервиса, который я хотел бы получить обратно к списку Практик, связанных с этим Сервисом. Или если first_name или last_name Доктора совпадает с query_string, тогда я получаю Практики, связанные с этим Доктором / Докторами. И конечно старый добрый матч по Practice.name тоже: D

Я понимаю, что мои ассоциации has_and_belongs_to_many здесь не очень хороши, это просто для демонстрации, но я был бы рад узнать, может ли кто-нибудь помочь с миграциями и ассоциациями для моего случая.

Спасибо.

P.S. как я уже сказал, я использую Rails 3.0 и считаю, что это должно что-то делать с областями видимости (но я могу ошибаться, конечно). Также я попробовал MetaWhere, но не смог заставить его работать ....: (

Ответы [ 2 ]

3 голосов
/ 04 октября 2011

Давайте посмотрим, как это получится:

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

Области действия , поэтому в прошлом году.

И некоторые оставшиеся присоединяются к Ferra (вам нужно проверить!)

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, далеко после моего сна.

0 голосов
/ 04 октября 2011

Вы можете покопаться в ARel ИЛИ - посмотрите, что я там сделал:) - посмотрите на очень удобный инструмент, который позволяет вам делать то, что вы хотите, с хорошим синтаксисом.

https://github.com/ernie/squeel

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...