2009-05-11 10 views
0

J'ai la jointure suivante table qui fonctionne:Comment charger des données dans une table de jonction Ruby on Rails?

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 

Mais je ne sais pas comment charger par défaut des données (syntaxe), j'essaie que:

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

Il ne fonctionne pas , est-ce RoleUser ... ou quelque chose d'autre à utiliser? RolesUser ... etc.

Répondre

0

Vous y êtes presque. Le nom de la table est une forme plurielle du nom du modèle. La table est nommée RolesUsers, le modèle est donc nommé RolesUser.

En outre, je pense que vous préféreriez utiliser la méthode new si vous appelez save! après le fait. Appeler create enregistre automatiquement l'enregistrement.

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

Lecture recommandée: http://api.rubyonrails.org/classes/ActiveRecord/Base.html

1

D'après ce que je comprends, votre user peut avoir beaucoup roles, non? Si oui ..

class User < ActiveRecord::Base 
    has_and_belongs_to_many :roles 
end 

class Role < ActiveRecord::Base 
    has_and_belongs_to_many :users 
end 

Ensuite, vous pouvez faire

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

Le has_and_belongs_to_many assoiation crée une table de jointure avec les deux FK. Si vous avez besoin de données supplémentaires dans la table de jointure, vous devrez utiliser has_may :through au lieu de has_and_belongs_to_many. Je recommande fortement la lecture the guide on ActiveRecord associations. Bonne chance!

+0

remerciements pour yo ur aider tout le monde, mais j'ai toujours une erreur lors de la migration: Une erreur s'est produite, toutes les migrations ultérieures ont été annulées: constante non initialisée CreateRolesUsers :: RolesUser == CreateRolesUsers: migration - create_table (: rôles_users, {: id => false}) -> 0.0470s J'utilise que: roles_users = RolesUser.new (: role_id => 2,: user_id => 1) roles_users.save! j'avais déjà établi des relations de HBTM dans Rôle et modèles utilisateur: rôle de classe

+0

Assurez-vous que votre fichier de migration est appelé [version] _create_roles_users.rb – andi

+0

quelle est la signification de 'item' et' order' ici? – inquisitive

2

A condition que vous ayez un modèle nommé RolesUser.

Si vous avez une association habtm, le modèle n'est probablement pas là.

Une façon de charger des rôles pourrait être;

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

user.roles << role 
0

Tout d'abord lorsque vous avez association has_and_belongs_to_many vous actualy ne pas le modèle, vous avez seulement table de base de données avec le nom pluriel combiné à partir de modèles qui participent en association, par exemple

class User < ActiveRecord::Base 
    has_and_belongs_to_many :roles 
end 

class Role < ActiveRecord::Base 
    has_and_belongs_to_many :users 
end 

Vous n » t obtenir un modèle nommé UserRoles, ou UsersRoles, ou UsersRole ou n'importe quel type de modèle, cela rend seulement certaines méthodes que vous pouvez utiliser sur l'instance User ou Role pour trouver tous ses rôles, ou pour trouver tous les utilisateurs avec un rôle four etc.

Cela fonctionne, que les rails chercheront la table de base de données avec le nom roles_users (il cherche la table qui est combinée avec les deux noms de modèles au pluriel, classant par ordre alphabétique, c'est pourquoi ses roles_users et non user_roles).

Pour utilisateur particulier, vous pouvez ajouter des rôles ou prédéfinir ceux qui existent déjà, par exemple:

# 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 

De cette façon, vous obtiendrez des enregistrements dans la table roles_users avec user_id de l'utilisateur et pour chaque rôle dans la collecte roles_c il y aura enregistrement, par exemple:

# 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 

Autre moyen est d'ajouter certains rôles,

user = User.first 
roles_c = Role.where('conditional statement') 
user.roles << roles_c 
user.save