Rails 多对多,带有额外信息的种子记录

Rails Many To Many, seed records with extra information

我正在尝试为以下数据结构播种:

class Company
    has_many :user_roles 
    has_many :users, through: :user_roles
end

class User 
    has_many :user_roles 
    has_many :companies, through: :user_roles
end

class UserRole 
    belongs_to :user
    belongs_to :company
end

除了字段 user_id 和 company_id 之外,UserRoles tables 还有字段 "role" 表明用户是 "member" 还是给定公司的“管理员。

我正在尝试按如下方式为 table 播种:

u1 = User.create(name: 'Tester 1')
u2 = User.create(name: 'Tester 2')

e1 = Company.create(name: 'Company 1')
e2 = Company.create(name: 'Company 2')

ur1 = UserRole.create(role: 'admin', user_id: 2, company_id: 1)
ur2 = UserRole.create(role: 'member', user_id: 3, company_id: 1)
ur3 = UserRole.create(role: 'admin', user_id: 3, company_id: 2)

但是当我尝试验证时,UserRole table 始终为空并且 tables 之间没有创建任何连接。 如果我尝试将用户直接添加到公司,使用

e1.users << [u1, u2]
e2.users << [u2]

然后显示UserRole table,但我不知道如何添加'role'信息。谢谢你的帮助! :)

But when I try to verify, the UserRole table is always empty and no connection is created between the tables.

您的 UserRole 对象很可能没有被创建,因为 id 不可用。确保使用 create! 而不是 create 这样你就会得到一个异常(create 将 return 无一例外地为 false,也就是说,它失败 静默 ) 并找出错误:

ur1 = UserRole.create!(role: 'admin', user_id: 2, company_id: 1)
ur2 = UserRole.create!(role: 'member', user_id: 3, company_id: 1)
ur3 = UserRole.create!(role: 'admin', user_id: 3, company_id: 2)

Then the UserRole table shows, but I don't know how to add the 'role' information.

创建对象后,您可以通过多种方式更新属性(查看 here 了解更多信息),最常见的是 =,然后是 save

e1.role = "admin"
e1.save

update:

e1.update(role: "admin")

附带说明:为确保您没有与 id 相关的错误,请使用您已经生成的对象(例如 u1e1)分配这些 id:

ur1 = UserRole.create!(role: 'admin', user_id: u1.id, company_id: e1.id)
ur2 = UserRole.create!(role: 'member', user_id: u2.id, company_id: e1.id)
ur3 = UserRole.create!(role: 'admin', user_id: u2.id, company_id: e2.id)

这样无论分配哪个 ID(请记住,删除记录不会重置数据库中的自动数字 ID),您将始终获得有效 ID。