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

时间:2016-01-27 12:32:25

标签: ruby-on-rails ruby calendar

我在事件创建者背后的理论(和代码)方面遇到了一些麻烦。快速概述: 我有Customers(用户),每个人都拥有Calendar。一个Calendar belongs_to一个Customer每个Calendar has_many EventsEvent 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遍历数组并为每个参与客户Event创建一个相应的Calendar

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

然而,这显然不令人满意,因为所创建的这些事件都不是彼此连接。我想知道最有效和最好的方法是让所有这些客户的日历分享事件(或共享一个唯一的标识符)。这样,如果创作者决定删除该活动,则会从所有参与的日历中删除该活动。

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

1 个答案:

答案 0 :(得分:1)

您可以自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(其中包含共享父event这是event的新current_customer。这样:

  • 新创建的event将通过events生成孩子event.events
  • 如果你销毁了event的{​​{1}},那么它的所有孩子current_customer都将被销毁
  • 您可以通过event
  • 访问特定event的父级活动