我不明白many_to_one< => one_to_one模型关联

时间:2018-01-01 04:22:39

标签: ruby associations one-to-one many-to-one sequel

怎么说?我不明白续集文档试图告诉我关于在一个模型中通过外键链接的两个模型的情况A在may_to_one情况下是另一个中的主键的关联。 我一直在想:如果它在一个方向上很多,那么在另一个方向上它必须是one_to_many ......但是续集提供了一个令人困惑的章节,旨在澄清这个话题,另外还有一个我无法遵循的例子。

它说 "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

在相册中,我可能会发现有几行指向同一位艺术家......为什么艺术家不应该回到他/她的所有专辑? 在许多情况下,续集文档很难读,但本章内容很简单但对我来说没有意义:(

1 个答案:

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