2010-05-05 8 views
0

Je ne suis pas sûr que je fais ces correctes.Comment ajouter une nouvelle entrée à une association multiple has_many?

J'ai 3 modèles, compte, utilisateur et événement.

Le compte contient un groupe d'utilisateurs. Chaque utilisateur a son propre nom d'utilisateur et mot de passe pour la connexion, mais ils peuvent accéder aux mêmes données de compte sous le même compte.

Les événements sont créés par un utilisateur, que les autres utilisateurs du même compte peuvent également lire ou modifier.

J'ai créé les migrations et les modèles suivants.


migration des utilisateurs

class CreateUsers < ActiveRecord::Migration 
    def self.up 
    create_table :users do |t| 
     t.integer  :account_id 
     t.string  :username 
     t.string  :password 
     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :users 
    end 
end 

Migration de compte

class CreateAccounts < ActiveRecord::Migration 
    def self.up 
    create_table :accounts do |t| 
     t.string  :name 
     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :accounts 
    end 
end 

migration événement

class CreateEvents < ActiveRecord::Migration 
    def self.up 
    create_table :events do |t| 
     t.integer  :account_id 
     t.integer  :user_id 
     t.string  :name 
     t.string  :location 
     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :events 
    end 
end 

modèle de compte

class Account < ActiveRecord::Base 
    has_many  :users 
    has_many  :events 
end 

modèle utilisateur

class User < ActiveRecord::Base 
    belongs_to :account 
end 

modèle d'événement

class Event < ActiveRecord::Base 
    belongs_to :account 
    belongs_to :user 
end 

so ....

  1. Est-ce réglage correct?
  2. Chaque fois qu'un utilisateur crée un nouveau compte, le système demande des informations sur l'utilisateur, par ex. nom d'utilisateur et mot de passe. Comment puis-je les ajouter dans les bonnes tables?
  3. Comment puis-je ajouter un nouvel événement?

Je suis désolé pour une question si longue. Je ne comprends pas très bien la façon dont les rails sont utilisés pour gérer une telle structure de données. Merci les gars de me répondre.:)

+0

Etes-vous sûr de vouloir créer un nom d'utilisateur et un mot de passe automatiquement? n'est-ce pas à l'utilisateur via un formulaire? – Tarscher

+0

les utilisateurs sont tenus de saisir leur propre nom d'utilisateur et mot de passe lors de l'enregistrement du compte. –

Répondre

2

Cela ressemble à un travail pour has_many :through (faites défiler vers le bas pour trouver l'option :through)

Si vous avez besoin de savoir l'utilisateur qui a créé l'événement, alors vous devriez préciser que l'événement appartient vraiment seulement à un utilisateur :

class Event < ActiveRecord::Base 
    belongs_to :user 
end 

Les comptes, cependant, peuvent "saisir" les événements de leurs utilisateurs. Vous spécifiez que comme ceci:

class User < ActiveRecord::Base 
    belongs_to :account 
end 

class Account < ActiveRecord::Base 
    has_many :users 
    has_many :events, :through => :users 
end 

Les migrations seraient les mêmes que vous avez écrit pour Account et User. Pour Event vous pouvez supprimer le account_id:

class CreateEvents < ActiveRecord::Migration 
    def self.up 
    create_table :events do |t| 
     t.integer  :user_id 
     t.string  :name 
     t.string  :location 
     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :events 
    end 
end 

Ensuite, vos événements peuvent être créés comme ceci:

# These two are equivalent: 
event = user.events.create(:name => 'foo', :location => 'bar') 
event = Event.create(:user_id => user.id, :name => 'foo', :location => 'bar') 

Notez que cela va créer et enregistrer l'événement inmediately. Si vous souhaitez créer l'événement sans l'enregistrer, vous pouvez utiliser user.events.build ou Event.new à la place.

Le has_many :through des comptes vous permettra d'obtenir tous les événements pour un seul compte:

user.events   # returns the events created by one user 
account.events  # returns all the events created by the users of one account 
user.account.events # returns the events for the user's account 

Comme note finale, s'il vous plaît noter que vous réinventer la roue beaucoup ici. Il existe de très bonnes solutions pour gérer les utilisateurs et les autorisations.

Je vous recommande de jeter un oeil à devise (railscast) ou authlogic (railscast) pour la gestion de vos comptes et declarative_authorization (railscast) ou cancan (railscast) pour la gestion des autorisations. Mes choix personnels sont devise et declaration_authorization. Le premier est plus facile à installer que authlogic, et le dernier est plus puissant que cancan.

Cordialement, et bonne chance!

+0

merci mon pote. je cherche ces gemmes pour longtemps. prendra un regard profond sur inventif et declarationative_authorization. –

Questions connexes