首先,当您有关联 has_and_belongs_to_many 时,您实际上没有模型,您只有从参与关联的模型组合而成的复数名称的数据库表,例如
class User < ActiveRecord::Base
has_and_belongs_to_many :roles
end
class Role < ActiveRecord::Base
has_and_belongs_to_many :users
end
您不会获得名为 UserRoles 或 UsersRoles 或 UsersRole 或任何类型的模型的模型,这只会使您可以在 User 实例或 Role 实例上使用一些方法来查找 1 个用户的所有角色,或查找所有用户有一些角色蚂蚁等。
这行得通,rails 将查找名称为roles_users 的数据库表(它查找与两个模型名称以复数形式组合的表,按字母顺序排序,这就是它的roles_users 而不是users_roles 的原因)。
对于特定用户,您可以添加角色或预定义现有角色,例如:
# find one user
user = User.first
# get collection of roles
roles_c = Role.where("some conditional statement to find roles")
# set user roles to found collection
user.roles = roles_c
# save changes
user.save
这样,您将在 roles_users 表中使用 user_id 获取记录,并且对于 roles_c 集合中的每个角色都会有记录,例如:
# if user.id is 1
# and in roles_c you have 3 roles with id_s 2,5 and 34
# in roles_users table there will be created 3 records with
user_id => 1, role_id => 2
user_id => 1, role_id => 5
user_id => 1, role_id => 34
另一种方法是添加一些角色,
user = User.first
roles_c = Role.where('conditional statement')
user.roles << roles_c
user.save