我有一个模型Show
和一个模型Artist
。我想要从Show
到Artist
的引用,但反之亦然。
所以Show
有一个Artist
,就是这样。我这样做了:
class Artist < ActiveRecord::Base
end
class Show < ActiveRecord::Base
has_one :artist
end
但它不起作用。我每次都这样做:
a_show.artist = an_artist
它没有分配它。我也明白了:
弃权警告:您正在尝试创建属性
show_id'. Writing arbitrary attributes on a model is deprecated. Please just use
attr_writer`等(从(irb)的irb_binding调用:3)
在我的数据库中,我在artist_id
类shows
表中有一个名为Integer
的列。
答案 0 :(得分:2)
我在Integer类型的show表中有一个名为artist_id的列
在这种情况下,类Show
中的关系应为belongs_to
而不是has_one
(belongs_to
始终位于包含外键的类上)。
答案 1 :(得分:0)
答案 2 :(得分:0)
对于这种类型的混淆,您应该参考Rails指南的Choosing Between belongs_to and has_one部分。
如果要在两个模型之间建立一对一的关系,则需要将belongs_to添加到一个,并将has_one添加到另一个。你怎么知道哪个是哪个?
区别在于您放置外键的位置(它在声明belongs_to关联的类的表上),但您应该考虑数据的实际含义。 has_one关系表示某事是你的 - 也就是说,某些东西指向你。例如,说供应商拥有的帐户比拥有供应商的帐户更有意义。这表明正确的关系是这样的:
class Supplier < ActiveRecord::Base
has_one :account
end
class Account < ActiveRecord::Base
belongs_to :supplier
end
相应的迁移可能如下所示:
class CreateSuppliers < ActiveRecord::Migration
def change
create_table :suppliers do |t|
t.string :name
t.timestamps
end
create_table :accounts do |t|
t.integer :supplier_id
t.string :account_number
t.timestamps
end
end
end