我有一個多態關聯,看起來像這樣:過濾態關聯的類型視圖
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_?還是有什麼更多的事件和事件'分開? – lime
能否請你展示什麼寫在Eventable ... –