Ruby Rails:允许不同的日历共享同一个事件?

Ruby on Rails: Allowing separate Calendars to share the same Event?

我的活动创建者背后的理论(和代码)有些问题。快速概览: 我有 Customers(用户),每个人都拥有一个 Calendar。一个Calendarbelongs_to一个Customer每个Calendarhas_manyEvents,一个Event belongs_to一个Calendar:

#customer.rb
class Customer < ActiveRecord::Base
  belongs_to :business
  has_one :calendar, :dependent => :destroy
...
end 

#calendar.rb
class Calendar < ActiveRecord::Base
  belongs_to :customer
  has_many :events, :dependent => :destroy    
end

#event.rb
class Event < ActiveRecord::Base
  belongs_to :calendar

end

当客户在 events\new.html.erb 中填写表单时,Events_controller 的 create 操作会从表单中获取信息,包括每个表单的数组 id_array事件的创建者希望参与的参与者客户。

到目前为止,我已经做到了 events_controller 遍历数组并为每个参与客户的 Calendar:

创建相应的 Event
def create

    @calendar = current_customer.calendar
    @newevent = @calendar.events.build(event_params) #creates event in creator's calendar

    @participant_ids = params[:id_array]

    @participant_ids.each do |item| #iterates through id array, finds corresponding customer and creates event
      @participant = Customer.find(item)
      @part_calendar = @participant.calendar 
      @part_event = @part_calendar.events.build(event_params) #adds event to participant's calendar
    end

    if @newevent.save
      redirect_to '/main' #'/main/#{@calendar.id}'
    else
      redirect_to '/compose'
      end

  end

然而,这显然不能令人满意,因为创建的这些事件中 none 根本 相互关联 。我想知道什么是最有效和 ruby​​ish 的最佳方式是允许所有这些客户的日历 share 事件(或共享唯一标识符)。这样一来,如果创建者决定删除活动,它将从所有参与的日历中删除。

Here is also my event db migrate file for reference:

class CreateEvents < ActiveRecord::Migration
  def change
    create_table :events do |t|

      t.timestamps
      t.references :calendar, foreign_key: true

      t.string :name
      t.string :description
      t.date :day
      t.datetime :starts_at
      t.datetime :ends_at
      t.string :location

    end
  end
end

你可以让Event自引用:一个事件会有很多事件并且属于一个事件:

型号

class Event < ActiveRecord::Base
  has_many :events, dependent: :destroy
  belongs_to :event, class_name: "Event"
end

您必须将 event_id 作为 integer

添加到迁移中

控制器

  def create
    @calendar = current_customer.calendar
    @newevent = @calendar.events.build(event_params) #creates event in creator's calendar

    if @newevent.save
      # We wait until it's saved because we need its id
      @participant_ids = params[:id_array]
      @participant_ids.each do |item|
        @participant = Customer.find(item)
        @part_calendar = @participant.calendar 
        # We merge the newly created event id to the params
        @part_event = @part_calendar.events.
          build(event_params.merge(event_id: @newevent.id))
        @part_event.save
      end
      redirect_to '/main' #'/main/#{@calendar.id}'
    else
      redirect_to '/compose'
    end
  end

这样你会得到这个:

假设 customer 有一个日历,您通过您的表单创建了一个 event 并且还选择了其他客户加入此 event:

current_customer 将有新的 event,您选择的每个其他 customer 将有一个新的 event(它们有一个共享的 parent event 这是 current_customer 的新 event)。这样:

  • 新创建的 event 将通过 event.events 获得一个 children events
  • 如果你破坏了current_customerevent,那么所有的childrenevent都会被破坏
  • 您可以通过 event.event
  • 访问特定 event 的 parent 事件