activerecord has_one

时间:2012-12-25 17:27:53

标签: ruby activerecord

我有一个模型Show和一个模型Artist。我想要从ShowArtist的引用,但反之亦然。

所以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_idshows表中有一个名为Integer的列。

3 个答案:

答案 0 :(得分:2)

  

我在Integer类型的show表中有一个名为artist_id的列

在这种情况下,类Show中的关系应为belongs_to而不是has_onebelongs_to始终位于包含外键的类上)。

答案 1 :(得分:0)

看看这个Association Basics

enter image description here

但你需要的是belongs_to,以便能够达到你想要的效果。

enter image description here

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