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 相关的错误,请使用您已经生成的对象(例如 u1
、e1
)分配这些 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。
我正在尝试为以下数据结构播种:
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 相关的错误,请使用您已经生成的对象(例如 u1
、e1
)分配这些 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。