我之前已经问过类似的问题,但是找不到我能够学到如何做到这一点的问题。
我有3个模特:婚礼,招待会和与会者
我们的想法是,用户可以前往婚礼的活动页面,其中包含一些信息,地址和接待列表。用户将能够选择他们将要访问的接收,插入他们的姓名和地址,然后作为该婚礼的与会者插入数据库。
我最麻烦的是围绕着让一个模型属于另外两个模型的想法。即接收模型属于婚礼模型和参加者模型。
我该怎么做呢?
这是我的架构:
create_table "attendees", force: :cascade do |t|
t.string "name", limit: 255
t.string "address", limit: 255
t.integer "people", limit: 4
t.string "receptions", limit: 255
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "events", force: :cascade do |t|
t.string "name", limit: 255
t.string "slug", limit: 255
t.text "description", limit: 65535
t.string "address", limit: 255
t.float "latitude", limit: 24
t.float "longitude", limit: 24
t.datetime "start_time"
t.datetime "end_time"
t.boolean "saved", limit: 1, default: false
t.integer "actable_id", limit: 4
t.string "actable_type", limit: 255
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "receptions", force: :cascade do |t|
t.string "address", limit: 255
t.float "latitude", limit: 24
t.float "longitude", limit: 24
t.integer "wedding_id", limit: 4
t.datetime "start_time"
t.datetime "end_time"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
add_index "receptions", ["wedding_id"], name: "fk_rails_40f4f8c049", using: :btree
create_table "weddings", force: :cascade do |t|
t.string "brides_name", limit: 255
t.string "grooms_name", limit: 255
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
add_foreign_key "receptions", "weddings"
哦,我也有一个活动表。我正在使用ActiveRecord :: ActsAs gem来让婚礼充当活动。
答案 0 :(得分:1)
Reception
模型肯定不会belong_to
Attendee
模型。
“接待”和“与会者”之间的关系可以是has_many,也可以是“has_many through”关系。值得一读full doco关联。
你提到:
这个想法是用户可以去参加婚礼的活动页面 它将有一些信息,一个地址和一个接待列表。 用户将能够选择他们将要进行的接待 在,插入他们的名字和地址,然后插入 数据库作为该婚礼的参与者。
为了澄清我们在正确的页面上,单一婚礼会有多次接待吗?个人客人可以选择他们将要参加的多个招待会中的哪一个?一个客人可以参加3次招待会中的2次,参加一场婚礼吗?婚礼本身呢?客人可以参加一些招待会,但不能参加相关的婚礼吗?或者,如果他们参加任何招待会,是否会自动假设他们也将参加婚礼?
您如何确定某个人是否真的被邀请参加婚礼?我可以浏览您的网站,只是将自己列为几个招待会的参加者,不请自来吗?
你描述数据模型的方式似乎有点 - 至少,你所描述的数据结构与我们以前习惯的婚礼不匹配。你可能有充分的理由。如果是这样,请更新您的问题,了解您正在尝试解决的基本问题以及您尝试建模的现实情况。它可以让人们更轻松地帮助你。
# wedding.rb
has_many :receptions
# reception.rb
belongs_to :wedding
has_many :attendees, through: :reception_attendees
# attendee.rb
belongs_to :wedding
has_many :receptions, through: :reception_attendees
# reception_attendee.rb
belongs_to :reception
belongs_to :attendee
因此,您需要在与会者和招待会之间建立“有很多通过”的关系。这意味着您将需要一个新的模型和数据库表reception_attendees
,它将成为接待和与会者之间的链接表。
答案 1 :(得分:0)
我认为这些关系有效:
# wedding.rb
has_many :attendees
has_one :reception
# attendee.rb
belongs_to :wedding
belongs_to :reception
# reception.rb
belongs_to :wedding
has_many :attendees