2011-12-14 2 views
1

У меня есть эта рабочая рельс. Модель событий, которая имеет собственные ассоциации объединения, чтобы найти любые вхождения события. У этого есть некоторые пользовательские геттеры, которые возвращают заголовок и описание main_events в любом случае.лучший способ использования ассоциаций самосоединения для вхождения события

Есть ли более эффективный способ сделать это в рельсах? и должно ли главное событие быть включено внутри событий?

Например, при повторении определенных событий в событии должна отображаться и дата основного события.

class Event < ActiveRecord::Base 

    # linked_event:integer name:string description:text date:datetime 

    has_many :occurrences, :class_name => "Event", :foreign_key => "linked_event" 
    belongs_to :main_event, :class_name => "Event", :foreign_key => "linked_event" 

    def name 
    return Event.find(self[:linked_event]).name if self[:linked_event] 
    return self[:name] 
    end 

    def description 
    return Event.find(self[:linked_event]).description if self[:linked_event] 
    return self[:description] 
    end 

end 

ответ

1

Лично я бы разделил два класса вверх; имеют модель Event, в которой есть имя и описание, а также модель Occurrence с датой. Затем Event has_many :occurrences

Когда вы получаете Event, вы проверяете, существует ли он в БД; если это так, вы просто создаете новый Occurrence, иначе вы создадите Event и один Occurrence.

Что-то вроде этого (настроить так, что он работает - я не проверял!):

class Event < ActiveRecord::Base 
    # name:string description:text 
    has_many :occurrences 
end 

class Occurrence < ActiveRecord::Base 
    # event_id:integer date:datetime 
    belongs_to :event 
end 

def add_event(params) 
    ev = Event.find_by_name(params[:name]) 
    if !ev 
    ev = Event.create!(params) 
    end 

    Occurrence.create!(:event => ev, :date => Time.now) 
end