0

我有以下有效的联接表:

class CreateRolesUsers < ActiveRecord::Migration
  def self.up
    create_table :roles_users,:id => false do |t|
      t.integer :role_id, :null => false
      t.integer :user_id, :null => false
    end    
  end

  def self.down
    drop_table :roles_users
  end
end

但我不知道如何默认加载一些数据(语法),我尝试:

roleUser = RoleUser.create(:role_id => 2,:user_id => 1)
roleUser.save!

它不起作用,是 RoleUser... 还是其他要使用的东西?角色用户...等。

4

4 回答 4

2

前提是您有一个名为 RolesUser 的模型。

如果您有一个 habtm 关联,则该模型可能不存在。

加载角色的一种方法可能是;

user = User.create :name => 'John'
role = Role.create :name => 'admin'

user.roles << role
于 2009-05-12T02:41:58.427 回答
1

据我了解,你user可以有很多roles,对吧?如果是这样..

class User < ActiveRecord::Base
  has_and_belongs_to_many :roles
end

class Role < ActiveRecord::Base
  has_and_belongs_to_many :users
end

然后你可以做

user = User.create :name => 'John'
role = Role.create :name => 'admin'
roles_users = RolesUser.create :user => user, :role => role

has_and_belongs_to_many关联创建一个包含两个 FK 的连接表。如果您需要连接表中的额外数据,则需要使用has_may :through而不是has_and_belongs_to_many.
我强烈建议阅读ActiveRecord 关联指南。祝你好运!

于 2009-05-11T20:35:34.920 回答
0

您快到了。表名是模型名的复数形式。表被命名RolesUsers,因此模型被命名RolesUser

new另外,如果您要在save!事后打电话,我认为您更愿意使用该方法。呼叫create自动保存记录。

rolesUser = RolesUser.new(role_id => 2,:user_id => 1)
rolesUser.save!

推荐阅读:http ://api.rubyonrails.org/classes/ActiveRecord/Base.html

于 2009-05-11T20:11:30.530 回答
0

首先,当您有关联 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
于 2014-11-25T11:57:45.160 回答