1

我有一个模型Show和一个模型Artist。我想要来自Showto的参考Artist,但反之亦然。

所以 aShow有一个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 useattr_writer` 等(从 (irb):3 的 irb_binding 调用)

在我的数据库中,我有一个名为table 类型artist_id的列。showsInteger

4

3 回答 3

2

我在整数类型的显示表中有一个名为 artist_id 的列

在这种情况下,类中的关系Show应该是belongs_to代替has_onebelongs_to总是在包含外键的类上)。

于 2012-12-25T17:54:39.143 回答
0

看看这个协会基础

在此处输入图像描述

但你需要的是belongs_to,才能实现你想要的。

在此处输入图像描述

于 2012-12-25T17:57:37.060 回答
0

对于这种类型的混淆,您应该参考Rails 指南的在 belongs_to 和 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
于 2014-02-26T02:21:58.647 回答