通过 HABTM 插入数据
inserting data through HABTM
我在用户和工作区之间有一个 HABTM 关联,它也有组。问题是我无法从用户插入数据介绍组。
class User < ActiveRecord::Base
has_and_belongs_to_many :workspaces #, dependent: :destroy
has_many :groups, through: :workspaces
end
class Workspace < ActiveRecord::Base
has_and_belongs_to_many :users, dependent: :destroy
has_many :groups, dependent: :destroy
end
这是加入 table 迁移:
class CreateUsersAndWorkspaces < ActiveRecord::Migration
def change
create_table :users_workspaces, id: false do |t|
t.belongs_to :user, index: true
t.belongs_to :workspace, index: true
end
end
end
在 rails 控制台中,当我尝试创建新组时:
u.groups.create!(name: "txt", workspace_id: 1 )
(0.1ms) begin transaction
(0.2ms) rollback transaction
ActiveRecord::HasManyThroughNestedAssociationsAreReadonly:
Cannot modify association 'User#groups' because it goes
through more than one other association.
有没有办法从用户创建组?
编辑:
在@evedovelli 的帮助下,我可以让它工作。但由于 user.workspace 是一个 ActiveRecord_Associations_CollectionProxy,它不是一个工作区 class,而是一个集合。添加'first',解决了问题,所以最后的代码是:
u.workspaces(id: 1).first.groups.create!(name: "txt")
现在假设我有更多的联想:
u.workspaces(id: 1).first.groups(id: 2).first.modelN(id:3).first.modelNplus1.create!(name: "txt")
我的最后一个问题是,这是正确的方法吗?
问题是Rails找不到用户的工作区和组 应该添加到(即使您像您一样在创建时指定 worspace_id)。
如错误消息中所述,HasManyThrough
的嵌套关联是只读的。因此,您可以直接从 user 读取 groups,但不能创建它们。
由于您在创建群组时知道workspace_id
,您可以简单地创建群组:
u.workspaces.find_by_id(1).groups.create!(name: "txt")
这样它将为右用户的工作空间创建组。
而且您应该能够通过像这样的其他协会继续这样做:
u.workspaces.find_by_id(1).groups.find_by_id(2).modelN.find_by_id(3).modelNplus1.create!(name: "txt")
我在用户和工作区之间有一个 HABTM 关联,它也有组。问题是我无法从用户插入数据介绍组。
class User < ActiveRecord::Base
has_and_belongs_to_many :workspaces #, dependent: :destroy
has_many :groups, through: :workspaces
end
class Workspace < ActiveRecord::Base
has_and_belongs_to_many :users, dependent: :destroy
has_many :groups, dependent: :destroy
end
这是加入 table 迁移:
class CreateUsersAndWorkspaces < ActiveRecord::Migration
def change
create_table :users_workspaces, id: false do |t|
t.belongs_to :user, index: true
t.belongs_to :workspace, index: true
end
end
end
在 rails 控制台中,当我尝试创建新组时:
u.groups.create!(name: "txt", workspace_id: 1 )
(0.1ms) begin transaction
(0.2ms) rollback transaction
ActiveRecord::HasManyThroughNestedAssociationsAreReadonly:
Cannot modify association 'User#groups' because it goes
through more than one other association.
有没有办法从用户创建组?
编辑: 在@evedovelli 的帮助下,我可以让它工作。但由于 user.workspace 是一个 ActiveRecord_Associations_CollectionProxy,它不是一个工作区 class,而是一个集合。添加'first',解决了问题,所以最后的代码是:
u.workspaces(id: 1).first.groups.create!(name: "txt")
现在假设我有更多的联想:
u.workspaces(id: 1).first.groups(id: 2).first.modelN(id:3).first.modelNplus1.create!(name: "txt")
我的最后一个问题是,这是正确的方法吗?
问题是Rails找不到用户的工作区和组 应该添加到(即使您像您一样在创建时指定 worspace_id)。
如错误消息中所述,HasManyThrough
的嵌套关联是只读的。因此,您可以直接从 user 读取 groups,但不能创建它们。
由于您在创建群组时知道workspace_id
,您可以简单地创建群组:
u.workspaces.find_by_id(1).groups.create!(name: "txt")
这样它将为右用户的工作空间创建组。
而且您应该能够通过像这样的其他协会继续这样做:
u.workspaces.find_by_id(1).groups.find_by_id(2).modelN.find_by_id(3).modelNplus1.create!(name: "txt")