2009-03-11 11 views
1

Ma question porte sur quelques différents dossiers actifsRails associations de table Active Record

class Respondent < ActiveRecord::Base 
has_many :phone_numbers, :dependent => :destroy 
has_many :email_addresses, :dependent => :destroy 
belongs_to :phone_number, :foreign_key=> "primary_phone_id" 
belongs_to :email_address, :foreign_key=> "primary_email_id" 
end 

class User < Respondent 
end 

class EmailAddress < ActiveRecord::Base 
belongs_to :respondent 
has_one :respondent 
end 

Le schéma de ces tables sont

create_table "email_addresses", :force => true do |t| 
    t.string "email" 
    t.integer "respondent_id" 
end 

create_table "respondents", :force => true do |t| 
    t.string "first_name" 
    t.string "last_name" 
    t.integer "primary_email_id" 
    t.integer "primary_phone_id" 
    t.string "type" 
end 

Ce que je suis en train d'accomplir est d'avoir les répondants, et par conséquent utilisateurs, capables d'avoir plusieurs adresses email mais seulement une principale. Pour cette raison, l'enregistrement de courrier électronique et les répondants enregistrent un lien les uns avec les autres. Toutes les adresses e-mail sont stockées dans l'enregistrement adresse_mail et référencent le répondant, et l'enregistrement du répondant a un identifiant pour un seul e-mail.

Dans le UserController le code suivant échoue

def create 
    @user = User.new(params[:user]) 
    @primary_email = EmailAddress.new(params[:primary_email]) 
    User.transaction do 
     @user.primary_email = @primary_email <=Undefined Method primary_email= 
     @user.save! 
     @primary_email.save! 
     redirect_to :action => :show, :id => @user 
    end 
end 

D'abord, est-ce possible ce que je fais? Comment puis-je modifier le code pour que ce code de contrôleur fonctionne?

Répondre

2

Oui, vous avez juste besoin d'avoir intimé email primaire associé:

has_one :primary_email, :class_name => "EmailAddress" 
+0

est-ce en plus ..? belongs_to: adresse_mail,: foreign_key => "primary_email_id" – stellard

+0

Cela permet de se débarrasser de l'erreur et l'e-mail est enregistré dans l'enregistrement EmailAddress avec la clé étrangère correcte. Cependant le primary_email_id dans Respondent est toujours nul ... une idée? – stellard

Questions connexes