它说 "Differences Between many_to_one and one_to_one"
如果要在两个模型之间设置1-1关系,那么外国>一个表中的键直接引用关联表,您必须使用 many_to_one在一个模型中,one_to_one在另一个模型中。怎么做 你知道哪个型号使用哪个?最简单的方法是 表具有外键的模型使用many_to_one,和 另一个模型使用one_to_one“
并继续提供这个奇怪的例子:
# Database schema:
# artists albums
# :id <----\ :id
# :name \----- :artist_id
# :name
class Artist
one_to_one :album
end
class Album
many_to_one :artist
end
在相册中,我可能会发现有几行指向同一位艺术家......为什么艺术家不应该回到他/她的所有专辑? 在许多情况下,续集文档很难读,但本章内容很简单但对我来说没有意义:(
答案 0 :(得分:0)
对我来说同样的问题。
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?
我们可以通过将one_to_one
中的任何一个替换为many_to_one
来修复此示例。
class Album
many_to_one :artist
end
在这种情况下,artist.album_id
将不会被使用。
class Artist
many_to_one :albums
end
在这种情况下,album.artist_id
将不会被使用。
问题是方法名称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