У меня есть полиморфные ассоциации, которая выглядит следующим образом:Фильтрация полиморфного объединения по типу для представления
class Event < ActiveRecord::Base
belongs_to :eventable, :polymorphic => true
end
С кучей типов:
class Nap < ActiveRecord::Base
include Eventable
end
class Meal < ActiveRecord::Base
include Eventable
end
module Eventable
def self.included(base)
base.class_eval do
has_one :event, :as => :eventable, :dependent => :destroy
accepts_nested_attributes_for :event, :allow_destroy => true
scope :happened_at, -> (date) {
where("events.happened_at >= ? AND events.happened_at <= ?",
date.beginning_of_day, date.end_of_day).order("events.happened_at ASC")
}
base.extend(ClassMethods)
end
end
module ClassMethods
define_method(:today) do
self.happened_at(Date.today)
end
end
end
И так далее.
Вот другой конец отношений:
class Person < ActiveRecord::Base
has_many :events
has_many :meals, {
:through => :events,
:source => :eventable,
:source_type => "Meal"
}
has_many :naps, {
:through => :events,
:source => :eventable,
:source_type => "Nap"
}
has_many :moods, {
:through => :events,
:source => :eventable,
:source_type => "Mood"
}
has_many :notes, {
:through => :events,
:source => :eventable,
:source_type => "Note"
}
...
end
Я хочу, чтобы захватить все события всех видов, принадлежащих к человеку для отображения на одном экране. Вот что я делаю:
def show
@events = Event.by_person(@person).happened_at(date)
@meals, @naps, @moods, @notes = [], [], [], [], []
@events.each do |e|
@meals << e.eventable if e.eventable_type == 'Meal'
@naps << e.eventable if e.eventable_type == 'Nap'
@moods << e.eventable if e.eventable_type == 'Mood'
@notes << e.eventable if e.eventable_type == 'Note'
end
end
мне нужно отфильтровать по типу, потому что представление будет отображать атрибуты типа специфичные в каждой секции зрения.
Вопрос: Должна ли эта логика отфильтровывать коллекцию events
по типу в свои собственные типы конкретных массивов в контроллере? Или в другом месте? Возможно, модель?
Я не хотел просто пропустить @events
к виду и проверить тип теста в самом представлении. Это было неправильно.
Я пытаюсь выяснить, если вы можете делать что-то странное в слое модели. Не могли бы вы добавить соответствующие выдержки из «Eventable» и «Person»? Я не совсем уверен в связях между ними. – lime
Кроме того, вы думаете о еде, дремотах, настроениях и заметках как _events_? Или есть что-то большее для разделения между «Event» и «Eventable»? – lime
Не могли бы вы показать, что написано в Eventable ... –