Ruby on rails ActiveRecord::语句在两个命名空间模型上无效
我必须在同一名称空间中创建两个具有habtm关系的模型Ruby on rails ActiveRecord::语句在两个命名空间模型上无效,ruby-on-rails,postgresql,rails-activerecord,has-and-belongs-to-many,Ruby On Rails,Postgresql,Rails Activerecord,Has And Belongs To Many,我必须在同一名称空间中创建两个具有habtm关系的模型 class Resource::Item < ApplicationRecord has_and_belongs_to_many :resource_sets, foreign_key: 'resource_item_id', class_name: 'Resource::Set', table_name: 'resource_items_sets' end class Resource::Set < Applicat
class Resource::Item < ApplicationRecord
has_and_belongs_to_many :resource_sets, foreign_key: 'resource_item_id', class_name: 'Resource::Set', table_name: 'resource_items_sets'
end
class Resource::Set < ApplicationRecord
has_and_belongs_to_many :resource_items, foreign_key: 'resource_set_id', class_name: 'Resource::Item', table_name: 'resource_items_sets'
end
到目前为止,一切看起来都很好。正在创建表resource\u items\u set
,其中包含两列resource\u item\u id
和resource\u set\u id
这是模式
create_table "resource_items_sets", id: false, force: :cascade do |t|
t.bigint "resource_item_id", null: false
t.bigint "resource_set_id", null: false
end
在创建一个资源项目之后,我得到了如下预期结果
pry(main)> Resource::Item.first.resource_sets
=> #<Resource::Set::ActiveRecord_Associations_CollectionProxy:0x3fdd08748004>
当resource\u set\u id
到处被声明时,set\u id
从何而来?如何解决此问题?我想保留这两个名称空间,因为我可能会创建项目并设置更多名称空间
非常感谢,伙计们 您需要在联接表的两侧设置外键,因为在您的情况下无法推断它们 在这种情况下,正确的
具有\u且\u属于\u许多
调用应如下所示:
has_and_belongs_to_many :resource_items,
foreign_key: 'resource_set_id',
association_foreign_key: 'resource_item_id',
class_name: 'Resource::Item',
join_table: 'resource_items_sets'
end
及
类资源::项
注意添加的
association\u foreign\u key
选项指定联接表中的其他外键。尝试在迁移中传递表名,因为表名应该是resource\u items\u resource\u set
,Rails从表名猜测关联外键。这就成功了!谢谢我不知道我怎么会错过文档中的关联\u外键
。链接供参考:
pry(main)> Resource::Item.first.resource_sets.count
ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column resource_items_sets.set_id does not exist
LINE 1: ...N "resource_items_sets" ON "resource_sets"."id" = "resource_...
^
: SELECT "resource_sets"."id" FROM "resource_sets" INNER JOIN "resource_items_sets" ON "resource_sets"."id" = "resource_items_sets"."set_id" WHERE "resource_items_sets"."resource_item_id" = $1 ORDER BY "resource_sets"."name" ASC
from /Users/username/.rvm/gems/ruby-2.6.0/gems/activerecord-5.2.2/lib/active_record/connection_adapters/postgresql_adapter.rb:677:in `async_prepare'
Caused by PG::UndefinedColumn: ERROR: column resource_items_sets.set_id does not exist
LINE 1: ...N "resource_items_sets" ON "resource_sets"."id" = "resource_...
has_and_belongs_to_many :resource_items,
foreign_key: 'resource_set_id',
association_foreign_key: 'resource_item_id',
class_name: 'Resource::Item',
join_table: 'resource_items_sets'
end
class Resource::Item < ApplicationRecord
has_and_belongs_to_many :resource_sets,
foreign_key: 'resource_item_id',
association_foreign_key: 'resource_set_id',
class_name: 'Resource::Set',
join_table: 'resource_items_sets'
end