我有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:...不存在
感谢您的帮助
答案 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_of
和dependent: :destroy
inverse_of
使得关联对象查找在Rails中的性能更高。没有将它添加到您的关联,事实证明相关的Rails对象不指向相同的内存中对象。这意味着如果没有inverse_of
,您总是会打到数据库,以便Rails获取关联。但是,如果你包含它,如果对象已经在内存中,Rails将只获取该对象!它本质上是内存中的双向绑定。
dependent: :destroy
用于父对象,以确保在销毁父对象时销毁关联对象。