has_many关联不会向表添加列

时间:2015-06-30 20:37:11

标签: ruby-on-rails ruby

我有2个表(TableA和TableB)。一个has_many Bs。

在Rails控制台上,这段代码的第二行不起作用:

func simpleClassName( complexClassName:String ) -> String {
    var result = complexClassName;
    var range = result.rangeOfString( "<" );
    if ( nil != range ) { result = result.substringToIndex( range!.startIndex ); }
    range = result.rangeOfString( "." );
    if ( nil != range ) { result = result.pathExtension; }
    return result;
}

我收到此错误: PG :: UndefinedColumn:ERROR:...不存在

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

这是因为您没有正确设置表格,并且您正在查询课程。

设置您的关联:

class TableA < ActiveRecord::Base
  has_many :table_bs, inverse_of: :table_a, dependent: :destroy
end

class TableB < ActiveRecord::Base
  belongs_to :table_a, inverse_of: :table_bs
end

您的相应迁移应如下所示:

rails g migration create_table_as name:string

rails g migration create_table_bs name:string table_a:references

rake db:migrate

您的TableB表格上会有一个table_a_id,这是关联固化的地方。

现在,您可以在irb实例中运行类似的内容:

@a = TableA.new

@b = TableB.new
@b.table_a = @a
@b.save

@a.table_bs
=> #<ActiveRecord::Associations::CollectionProxy [#<TableB id: 1, name: "Foo"]>

<强>更新

以下是inverse_ofdependent: :destroy

的简短解释

inverse_of使得关联对象查找在Rails中的性能更高。没有将它添加到您的关联,事实证明相关的Rails对象不指向相同的内存中对象。这意味着如果没有inverse_of,您总是会打到数据库,以便Rails获取关联。但是,如果你包含它,如果对象已经在内存中,Rails将只获取该对象!它本质上是内存中的双向绑定。

dependent: :destroy用于父对象,以确保在销毁父对象时销毁关联对象。