фильтр подклассов ruby - PullRequest
       1

фильтр подклассов ruby

3 голосов
/ 29 марта 2010

Эй!Возможно, я неправильно понимаю идею подкласса, но у меня есть модель Person, и у нее есть атрибут с именем age, поэтому

Person.first.age #=> '20'

Теперь я хочу иметь модель, которая в основном рассчитана на людей 55 лет и старше, поэтомуЯ знаю, что у меня может быть такой класс: класс Senior

Но как я могу "предварительно отфильтровать" класс Senior, чтобы у каждого объекта, принадлежащего этому классу, был возраст> = 55?

Senior.first.age #=> 56

ОБНОВЛЕНИЕ1: Скажем, у меня есть компания has_many people, а Person Person__ Company, поэтому Company.first.people # => ["Джек", "Кейт"]

Если возраст Джека>55, будет ли он работать тогда: Company.first.seniors # => "jack"

или

Company.first.people.senior (s) # => "jack"?

Я знаю, что named_scope может быть тем, что я хочу, но я также замечаю, что named_scope, похоже, является методом переменной класса Person.Не его примеры, которые имеют смысл для меня.- Итак, если бы я разработал такой удобный фильтр для коллекции моделей activerecord (объектов одного класса), как мне это сделать?Я предполагаю, что мне пришлось бы использовать «обнаружение» для такого массива, но куда это пойдет в определении модели?

Обновление 2 Я совершенно уверен, что я не был ясен, поэтому пример Хотите: первая компания в возрасте 55 лет и старше Company.first.people.detect {| p |p.age> 54}

Я знаю, что это не очень долго, но мои условия пойдут дальше, чем просто> 54, и каждый раз обнаруживать это будет неуклюже.

Спасибо!

Ответы [ 3 ]

7 голосов
/ 29 марта 2010

Вы можете использовать именованные области действия

class Person < ActiveRecord::Base
  named_scope :seniors, :conditions => ['age >= ?', 55]
end

Person.seniors.first.age #=> 83
3 голосов
/ 29 марта 2010

Это должно сработать.

class Person
  def self.abstract_class?
    true
  end
end

class Junior < Person
  set_table_name "people"
  default_scope :conditions => "people.age < 55"
end

class Senior < Person
  set_table_name "people"
  default_scope :conditions => "people.age >= 55"
end

Но я бы пересмотрел, является ли это хорошей идеей. Но если вы решите пойти на это, пожалуйста, используйте абстрактный класс "Person", чтобы избежать проблем с реализацией STI в Rails.

0 голосов
/ 29 марта 2010

Я не знаю, как это сделать с помощью подкласса, но вы можете сделать это с помощью метода класса следующим образом.

class Person < ActiveRecord::Base
  def self.senior
    find(:all, :conditions=>["age>=?"], 55)
  end
end

и вы можете вызвать его с любого контроллера следующим образом

senior_age = Person.senior.first.age unless Person.senior.blank?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...