Ruby 我不了解多对一<=&燃气轮机;一对一模型关联
怎么说?我不明白续集文档试图告诉我的关于两个模型通过外键链接的情况下的关联,一个模型a是另一个模型a中的主键,另一个是may_to_。 我一直在想:如果一个方向是多对多,那么另一个方向就是一对多。。。但续集提供了一个混乱的章节,旨在澄清这个话题,另外还有一个我无法遵循的例子 上面写着 如果要在两个模型之间设置1-1关系,其中一个表中的foreign>键直接引用关联的表,则必须使用 一个模型中有多个“一对一”,另一个模型中有多个“一对一”。怎么办 你知道在哪种型号中使用哪种吗?最简单的记忆方法是 表具有外键的模型使用多对一,以及 另一个模型使用“一对一” 并继续提供这个奇怪的例子:Ruby 我不了解多对一<=&燃气轮机;一对一模型关联,ruby,associations,one-to-one,many-to-one,sequel,Ruby,Associations,One To One,Many To One,Sequel,怎么说?我不明白续集文档试图告诉我的关于两个模型通过外键链接的情况下的关联,一个模型a是另一个模型a中的主键,另一个是may_to_。 我一直在想:如果一个方向是多对多,那么另一个方向就是一对多。。。但续集提供了一个混乱的章节,旨在澄清这个话题,另外还有一个我无法遵循的例子 上面写着 如果要在两个模型之间设置1-1关系,其中一个表中的foreign>键直接引用关联的表,则必须使用 一个模型中有多个“一对一”,另一个模型中有多个“一对一”。怎么办 你知道在哪种型号中使用哪种吗?最简单的记忆方法是
# Database schema:
# artists albums
# :id <----\ :id
# :name \----- :artist_id
# :name
class Artist
one_to_one :album
end
class Album
many_to_one :artist
end
#数据库模式:
#艺术家专辑
#:id我也有同样的问题
require "logger"
require "sequel"
db = Sequel.connect "postgres://localhost/postgres", :logger => Logger.new(STDOUT)
db.drop_table :artists, :cascade => true if db.table_exists?(:artists)
db.create_table :artists do
primary_key :id
foreign_key :album_id, :albums
end
db.drop_table :albums, :cascade => true if db.table_exists?(:albums)
db.create_table :albums do
primary_key :id
foreign_key :artist_id, :artists
end
class Artist < Sequel::Model(db[:artists])
one_to_one :album
end
class Album < Sequel::Model(db[:albums])
one_to_one :artist
end
artist_1 = Artist.create
album_1 = Album.create
artist_1.update :album => album_1
album_1.reload
puts album_1.artist.nil?
artist_2 = Artist.create
album_2 = Album.create
album_2.update :artist => artist_2
artist_2.reload
puts artist_2.album.nil?
在这种情况下,将不使用artist.album\u id
class Artist
many_to_one :albums
end
在这种情况下,album.artist\u id
将不被使用
class Artist
many_to_one :albums
end
问题是,方法名one-to-one
和many-to-one
是由底层sequel
逻辑选择的,它们对用户不友好
您可以为这些方法创建用户友好的别名。我更喜欢将其与注释一起使用。例如:
db.create_table :artists do
primary_key :id
foreign_key :album_id, :albums
end
db.create_table :albums do
primary_key :id
end
class Artist < Sequel::Model(db[:artists])
many_to_one :album # I have album_id foreign key
end
class Album < Sequel::Model(db[:albums])
one_to_one :artist # I don't have artist_id foreign key
end
db.create_表:艺术家做什么
主键:id
外键:相册id,:相册
结束
db.create_表:相册可以吗
主键:id
结束
类艺术家<续集::模型(db[:艺术家])
多对一:相册#我有相册id外键
结束
类相册<续集::模型(db[:相册])
一对一:艺术家#我没有艺术家id外键
结束
因为您只需要在一个表中指定关系,并且使用多对一关系,所以在每个“子”中有一个字段是有意义的“指向父记录id的记录。如果要查找父记录的所有子记录,则需要查询父记录id字段等于父记录id的所有子记录。我同意此示例没有什么意义,因为它似乎暗示一个艺术家只能有一个相册
(一对一
)但是许多专辑可以属于一个艺术家(many-to-one
)。我认为这只是为了显示关联之间的差异,因为上面更明确地记录了每个关联,但他们本可以选择一个更好的示例我坐在一个未运行的模型前面(最后复数s太多了…因为在续集中并不总是清楚一个模型或一个表是什么意思)。。。在经历了漫长的夜晚之后,我在凌晨4点打开了docu,发现这是“额外的协同作用”)。。。我仍然无法想象一个单一的场景,即多对一以逻辑的方式被一对一加倍。这就是为什么我认为我在从sql到sequel模型的过程中错过了一个大概念。一对一很有用,因为它直接返回对象,而在许多关联中,你有一个数组。它也更快,因为它迫使sequel选择第一个结果,而不是在整个表格中寻找命中率。