0

我正在尝试为 rails 应用程序创建数据模型。

基本上我有一个位置表,其中包含四个不同位置的记录。我正在尝试为每天的每个位置创建时间段。例如。Location1 有 5 个 9am 时段、5 个 11am 时段等。

我现在需要能够为给定时间段的位置创建安排。

目前我有这个应用程序工作,唯一的问题是,当您保存安排时,您还必须使用安排 id 更新时间段记录,并且每天每个位置的每个时间段也必须存在记录。

我知道必须有更好的方法来做到这一点。

这是我当前的数据模型:

在此处输入图像描述

这是我当前的模型设置:

class Location < ActiveRecord::Base
    has_one :arrangement
    has_many :timeslots
end

class Timeslot < ActiveRecord::Base
    belongs_to :location
    has_one :arrangement
end

class Arrangement < ActiveRecord::Base
    belongs_to :location
    belongs_to :timeslot
end

这是我在排列控制器中当前创建方法的一个片段:

if @arrangement.save
# update the timslot record with the arrangement id
if @timeslot = Timeslot.update(@arrangement.timeslot_id, :arrangement_id => @arrangement.id)

我怎样才能使这个数据模型更好?

编辑 理想情况下,我正在寻找一个数据模型,我不必为每个位置和每天填充时间段。

从理论上讲,我希望有一个只包含每个位置的所有时隙的时隙表,这样我就不必手动填充时隙表。

我最担心的是必须为未来 30 年填充时间段表。

4

2 回答 2

0

由于您将假设为每个位置生成一些时隙,因此这将部分起作用:

class Location < ActiveRecord::Base
    has_many :timeslots
    has_many :arrangements, :through => :timeslots
end

class Timeslot < ActiveRecord::Base
    belongs_to :location
    has_one :arrangement
end

class Arrangement < ActiveRecord::Base
    belongs_to :timeslot
end

设置它的问题是您将无法normally获取安排位置,因为您无法建立belongs_to through关系。但是你基本上可以做到arrangement.timeslot.user,而不是与 a 建立 belongs_to 关系location,这有点多余,但你也可以这样做。

您不需要在关系的 has_one 端设置 id:

http://guides.rubyonrails.org/association_basics.html#the-has_one-association

于 2013-03-15T00:09:56.913 回答
0

你真的需要 和 之间的直接关联LocationArrangement?相反,我会考虑使用has_many :through关联来组织它,如下所示:

class Location < ActiveRecord::Base
    has_many :timeslots
    has_many :arrangements, through: :timeslots
end

class Timeslot < ActiveRecord::Base
    belongs_to :location
    has_one :arrangement
end

class Arrangement < ActiveRecord::Base
    belongs_to :timeslot
end

如果你这样做,你会创建一个Arrangement属于 a 的 as Timeslot,所以你不需要手动更新它。如果您想获得Arrangementa 的所有 s Location,您仍然可以这样做,location.arrangements因为您通过时隙设置了关联。如果您需要知道安排的位置,您可以使用arrangement.timeslot.location.

(注意,我假设每个Location实际上可以有多个Arrangements,并且has_one您的问题中的 s 是一个错误?如果我在这方面错了,请告诉我。)

于 2013-03-15T00:20:40.860 回答