Именованный объем / фильтр вопроса - PullRequest
1 голос
/ 03 августа 2011

Извините, я по-прежнему немного зеленоват с Ruby on Rails, если не сказать больше, поэтому я был бы признателен, даже если меня направили в том же направлении.

Итак ... У меня есть три таблицы БД, давайте назовем их людьми, работами и шляпами. У меня есть область, которая возвращает только людей, которые выполняют определенную работу:

named_scope :emergency_workers, :include => :job, :conditions => {'jobs.name' => 'Police', 'jobs.name' => 'Fire','jobs.name' => 'paramedic'}

У меня есть область, которая возвращает только людей, которые носят шляпу:

named_scope :hat_wearers, :include => :job, :joins => :hat, :conditions => ["hats.name IS NOT ?", nil]

Мой вопрос заключается в том, как мне определить область действия, которая гласит: «Покажите мне только людей, которые носят шляпу (как указано выше), если они не выполняют эту конкретную работу, скажем, фермер». Итак, мой код вернул бы всех владельцев шляп и всех фермеров.

Не уверен, имеет ли это смысл, но я был бы очень благодарен за руководство ...

Ответы [ 2 ]

2 голосов
/ 03 августа 2011

Я не уверен, как сконструировать это как один запрос, но используя синтаксис Rails 3, вы могли бы указать заданные области, а затем создать метод, который возвращает уникальные результаты из двух найденных областей:

class People < ActiveRecord::Base
  ...
  scope :emergency_workers, joins(:jobs).where('jobs.name IN (?)',['Police','Fire','Paramedic'])
  scope :hat_wearers, joins(:hats).where('hats.name IS NOT ?', nil)
  scope :farmers, joins(:jobs).where('jobs.name= ?', 'farmer')
  ...

  def hats_and_farmers
    result = self.class.hat_wearers + self.class.farmers
    result.uniq
  end
  ...
end

РЕДАКТИРОВАТЬ:

Я не знаю, как написать SQL для поиска на основе трех таблиц, но если вы делаете (согласно вашему комментарию), просто напишите это:

People.find_by_sql('Your custom from scratch query goes here.')

См .: http://guides.rubyonrails.org/active_record_querying.html#finding-by-sql

Все, что вызывает это из модели, это сообщает Rails, какой объект вы ожидаете, что запрос вернет, чтобы он мог создавать их экземпляры как объекты, готовые длявам использовать.Таким образом, для вас предварительно не написано SQL.

0 голосов
/ 03 августа 2011

Я бы рекомендовал использовать две отдельные именованные области и связать их вместе.Вы можете использовать существующую область hat_wearers, а также определить область, в которой исключается имя задания:

named_scope :hat_wearers, :joins => :hat, :conditions => ["hats.name IS NOT ?", nil]
named_scope :without_worker, lambda{|j| :joins  => :job, :conditions => ['jobs.name != ?', j]}

Теперь вы можете объединить их в цепочку и вызвать person.hat_wearers.without_worker('farmer'), а также использовать областииндивидуально.

Предупреждение: в зависимости от используемой вами версии Rails объединение областей с: joins может оказаться сложным.Несколько человек написали об этом в Интернете и спросили об этом на этом сайте, так что проверьте это, если вы застряли.

...