Именованные группы условий для экземпляров


У меня есть следующие схемы отношений:

class Participation
  belongs_to :toon
  belongs_to :person

  validates :role, :presence => true
end

class Toon
  has_many :participations
  has_many :people, :through => :participations
end

class Person
  has_many :participations
  has_many :toons, :through => :participations
end

Я хочу сделать людей ассоциации, связанные с мультяшками, но произведена его фильтрация по роли атрибута значение. Мне нужно что-то вроде мультяшек.people_with_role ("продюсер").

class Toon < ActiveRecord::Base
  has_many :participations
  has_many :people, :through => :participations

  def people_with_role(role)
    Participation.where(:toon_id => self, :role => role).map(&:person)   
  end
end

Это работает, но я не уверен, что это лучший способ, чтобы сделать это.



1775
1
задан 4 декабря 2011 в 10:12 Источник Поделиться
Комментарии
2 ответа

Вот еще один способ фильтрации людей на роли:

class Participation < ActiveRecord::Base
belongs_to :toon
belongs_to :person

validates :role, :presence => true
end

class Person < ActiveRecord::Base
has_many :participations
has_many :toons, :through => :participations
end

class Toon < ActiveRecord::Base
has_many :participations
has_many :people, :through => :participations do
def with_role(role)
where('participations.role' => role)
end
end
end

Теперь, вы можете получить люди профильтрована на роли мультяшек.люди.with_role ("продюсер").

2
ответ дан 10 декабря 2011 в 09:12 Источник Поделиться

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

scope :for_toon_with_role, lambda { |toon, role| joins(:participations).where(:participations => {:role => role, :toon_id => toon.id }) }

Таким образом, вы можете называть это так:

Person.for_toon_with_role(toon, 'role').all

Узнайте подробнее на рельсы областей здесь:рейлинги области

0
ответ дан 10 декабря 2011 в 08:12 Источник Поделиться