一个模型属于两个模型

时间:2015-05-11 22:48:54

标签: ruby-on-rails ruby activerecord belongs-to

我之前已经问过类似的问题,但是找不到我能够学到如何做到这一点的问题。

我有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来让婚礼充当活动。

2 个答案:

答案 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