gpt4 book ai didi

ruby-on-rails - has_many :through Association - Modification?

转载 作者:行者123 更新时间:2023-12-04 02:17:17 28 4
gpt4 key购买 nike

我已经通读了 basics of association但我的应用程序适合 `has_many :through 关联......但我的 other question 只存在一个问题缺乏。

我宁愿问另一个问题,只是为了让我的问题清晰明了。

根据我对 has_many :through 关联工作方式的理解,每当医生有新患者时,就会为该患者创建或必须创建一个预约。虽然这完全有道理,my app一点都不喜欢。

在我的例子中,每当用户“喜欢”某人的帖子时,它就会创建一个新帖子。我一点都不想要。我试图了解 Rails 协会,以便我可以回答与此相关的其他问题。如何防止自动创建另一个“约会”?或者更确切地说,当 patient 的新实例被创建并合并到 doctor.patients 时,它会创建一个新的约会。

d = Doctor.new
p = Patient.new
a = Appointment.new # created or not

foo = Doctor.find(1)
foo.patients << p # this creates a new appointment which i do not want.

最佳答案

每当存在多对多关系时,例如:

  • 任何一个医生都可以有多个病人
  • 任何一个病人都可以有多个医生

数据库实际上需要第三张表。这是因为我们不能将多个值放入 doctor 表的 patient_id 列中,而且我们不能只添加额外的列(你怎么知道要添加多少,搜索将是一个噩梦!)。

解决方案是创建一个“连接”表,它只是一个包含两列的表——在本例中为 doctor_idpatient_id。如果医生“x”有病人“a”、“b”和“c”,我们可以简单地向这个连接表中添加三个记录。如果患者“a”有两个医生,“x”和“y”,我们也可以表示:

示例连接表“doctors_patients”

doctor_id | patient_id
x a
x b
x c
y a

看看它是如何解决这个问题的?在您引用的示例中,appointment 表虽然是一个模型,但也充当医生和患者的连接表。您没有理由不能在联接表上添加其他列,例如日期、时间、房间号等。

示例连接表“约会”

doctor_id | patient_id |  date
x a 1/1/2016
x b 1/2/2016
x c 1/3/2016
y a 1/4/2016

但如果不需要引用表示连接表的模型,您可以简单地使用 has_and_belongs_to_many 关联 ( see Rails Guide )。无论如何,您仍然需要在迁移中创建连接表,同样,您需要它来表示多对多关联,但没有理由必须给它命名或用模型表示它。

模型:

class User < ActiveRecord::Base
has_and_belongs_to_many :posts
end

class Post < ActiveRecord::Base
has_and_belongs_to_many :users
end

迁移:

class CreateUsersAndPosts < ActiveRecord::Migration
def change
create_table :users do |t|
t.string :name
t.timestamps null: false
end

create_table :posts do |t|
t.text :content
t.timestamps null: false
end

# This is the join table
create_table :posts_users, id: false do |t| # posts comes before users alphabetically
t.belongs_to :posts, index: true
t.belongs_to :users, index: true
end
end
end

关于ruby-on-rails - has_many :through Association - Modification?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33139376/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com