лучший способ использовать ассоциации самообъединения для событий - PullRequest
1 голос
/ 14 декабря 2011

У меня есть эта рабочая направляющая Модель событий, в которой есть несколько ассоциаций самостоятельного объединения, чтобы найти любое вхождение события. У него есть несколько пользовательских методов получения, которые возвращают заголовок и описание 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 Ответ

1 голос
/ 14 декабря 2011

Лично я бы разделил два класса; иметь модель 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  
...