Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails ActiveRecord::语句在两个命名空间模型上无效_Ruby On Rails_Postgresql_Rails Activerecord_Has And Belongs To Many - Fatal编程技术网

Ruby on rails ActiveRecord::语句在两个命名空间模型上无效

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

我必须在同一名称空间中创建两个具有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 < 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