我想以[多对多的关系存储额外的数据,类似于this Django example和Postgres中的Sequel。
在我的例子中,每个人都有一个工作的地方,以及在那里工作的时间。每个人可以在同一地点工作不同的时间。例如...
Joe works at The Bar Mon, Wed & Fri 9-5pm.
Joe also works at The Bar Saturday noon-midnight.
Joe works at Some Pub Sunday 12-5.
Joe started working at The Bar 2013-12-07
Joe started working at Some Pub 2014-12-23
我想知道如何设置表和模型以使其尽可能不尴尬。目前,我有一个这样的架构。
create_table(:people) do
primary_key :id
String :name
end
create_table(:works) do
primary_key :id
String :name
end
create_table(:employments) do
primary_key :id
foreign_key :work_id, :work, null: false,
foreign_key :person_id, :people, null: false,
Date :started
end
create_table(:hours) do
primary_key :id
foreign_key :employment_id, :employments, null: false
String :dow, null: false,
Time :start, null: false, only_time: true
Time :end, null: false, only_time: true
end
我应该如何创建模型关联以将其全部结合在一起?理想情况下,我希望能够说类似...
joes_hours_at_some_pub = joe.employment("Some Pub").hours
...无需通过中间联接表。
Sequel's advanced association doc有一个例子。定义一个就业模型,并使用:join_table通过它创建关系。
class Person < Sequel::Model
one_to_many :employments,
many_to_many :works, join_table: :employments
# This allows joe.employment(work).hours
def employment(work)
employments_dataset.where(work_id: work.id)
end
end
class Work < Sequel::Model
one_to_many :employments,
many_to_many :people, join_table: :employments
end
class Employment < Sequel::Model
many_to_one :person
many_to_one :work
one_to_many :hours
end
class Hours < Sequel::Model
many_to_one :practice
end