2009-03-11 15 views
1

私の質問には、いくつかの異なる活性記録Railsの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 

スキーマが含まれ、これらのテーブルは

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 

私は何を達成しようとしていることは、回答者を持つことであるので、あるために複数の電子メールアドレスを持つことができますが、プライマリは1つだけです。このため、電子メールレコードと回答者は互いにリンクを記録します。すべての電子メールアドレスはemail_addressレコードに格納され、回答者を参照し、回答レコードには1つの電子メールのみに対するIDが割り当てられます。

UserControllerでは、次のコードは、

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 

最初に失敗した、これは私がやっている何でも可能ですか? このコントローラコードを動作させるためにコードを変更するにはどうすればよいですか?

答えて

2

はい、あなただけ関連付けられているプラ​​イマリ電子メールとして持っている回答者が必要:

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

は、に加えて、このですか..? belongs_to:email_address、:foreign_key => "primary_email_id" – stellard

+0

これはエラーを取り除き、電子メールは適切な外部キーを持つEmailAddressレコードに保存されます。しかし、回答者のprimary_email_idはまだnullです。 – stellard