【问题标题】:Inserting a value has_and_belongs_to_many associated table on Rails在 Rails 上插入一个值 has_and_belongs_to_many 关联表
【发布时间】:2016-10-19 16:30:22
【问题描述】:

我已经使用 Rails 上的脚手架命令生成了两个表及其模型和控制器

两张表分别是User和Role

scaffold 命令创建两个表模型和控制器。

app/models/user.rb

class User < ApplicationRecord
  has_and_belongs_to_many   :roles
end

app/models/role.rb

class Role < ApplicationRecord
    has_and_belongs_to_many :users
end

然后我用下面的命令生成了多对多关系第三张表。

rails generate migration CreateJoinTableUserRole User Role

对于这第三个表 rails 不会生成模型或控制器。如何将值添加到此表中?我需要单独为这个表创建模型还是另一种方式?

【问题讨论】:

    标签: mysql ruby-on-rails ruby


    【解决方案1】:

    要生成迁移:

    rails g migration create_join_table :roles, :users
    

    然后,您可以像这样简单地保存关联:

    @user.roles << @role
    

    其中@userUser 对象,@roleRole 对象。

    注意:这里您应该始终牢记的是连接表名称按字母顺序排列,在这种情况下 roles 应该在 users,因此:roles_users 将是为使 HABTM 按照 Rails 约定工作而应创建的表。

    【讨论】:

    • 在角色表中我只有两个字段
    • id 和角色名称。我如何创建@role 对象并分配它。对不起。我是 Rails 新手..
    • Role.create(role_name: 'admin') 然后Role.find(1) 其中“1”(假设之前没有条目)是roles 表中行的ID。
    【解决方案2】:

    对于第三张表,您不需要任何控制器或模型。它存储userrole的记录。 当您为UserController 或其他任何地方的用户创建role 时:

    @user.roles << @role
    

    假设您有两个对象 @user 和 @role 分别属于 User 和 Role 类。

    它将在该表中创建一个新行,其中包含 @user 的 id 和 Roles 的 id 并且对于相反的情况相同,即当您为角色创建 user 时。

    @role.users << User.find(1)
    

    @roles.users << @user
    

    HABTM 关联的 Rails 指南。

    【讨论】:

    • 你能给我完整的命令来添加第三个表的条目吗?我的第三张表只有条目 user_id 和 role_id
    • 我已经向您展示了一些示例和参考链接。只是这样做,它会填充 user_idrole_id 本身。如果没有看到您要实现的目标,我无法给您实际的代码。
    • 这是行不通的,因为 HABTM 不会保存 Role.new 对象,因此它不会将其保存在 @user.roles 中,反之亦然。 Role.find(1) 可能是一个更好的例子。
    • 你说得对,我有点分心。我会编辑
    • 另外,OP 正在创建一个不符合 Rails 约定的连接表,它是 CreateJoinTableUserRole 而不是 CreateJoinTableRolesUsers。因此,为了解决这个问题,还应该解释在 OP 试图创建的关联中添加一个 join_table: 选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多