Ruby Rails:允许不同的日历共享同一个事件?
Ruby on Rails: Allowing separate Calendars to share the same Event?
我的活动创建者背后的理论(和代码)有些问题。快速概览:
我有 Customers
(用户),每个人都拥有一个 Calendar
。一个Calendar
belongs_to
一个Customer
每个Calendar
has_many
Events
,一个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 根本 相互关联 。我想知道什么是最有效和 rubyish 的最佳方式是允许所有这些客户的日历 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_customer
的event
,那么所有的childrenevent
都会被破坏
- 您可以通过
event.event
访问特定 event
的 parent 事件
我的活动创建者背后的理论(和代码)有些问题。快速概览:
我有 Customers
(用户),每个人都拥有一个 Calendar
。一个Calendar
belongs_to
一个Customer
每个Calendar
has_many
Events
,一个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 根本 相互关联 。我想知道什么是最有效和 rubyish 的最佳方式是允许所有这些客户的日历 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
获得一个 childrenevents
- 如果你破坏了
current_customer
的event
,那么所有的childrenevent
都会被破坏 - 您可以通过
event.event
访问特定
event
的 parent 事件