1

これは全体的に間違っているかもしれませんが、誰かがチャープして助けてくれるかもしれません。ビルドhas_many:through新しいオブジェクト

問題

私はこれがうまくいくよう、保存されていないオブジェクト上の関係を構築することができるようにしたい:

v = Video.new 
v.title = "New Video" 
v.actors.build(:name => "Jonny Depp") 
v.save! 

これに追加するには、これらを介して生成されますカスタムメソッドを使用していますが、これは次のように動作します。

v = Video.new 
v.title = "Interesting cast..." 
v.actors_list = "Jonny Depp, Clint Eastwood, Rick Moranis" 
v.save 

このメソッドはvid私は

v.actors.map(&:name) 
=> ["Jonny Depp", "Clint Eastwood", "Rick Moranis"] 

Unfortunatey、これらの戦術を期待して何

def actors_list=value 
    #Clear for existing videos 
    self.actors.clear 

    value.split(',').each do |actorname| 
    if existing = Actor.find_by_name(actorname.strip) 
     self.actors << existing 
    else 
     self.actors.build(:name => actorname.strip) 
    end 
    end 
end 

をeo.rbでもない俳優や関連付けを作成します。

私もようactors_list=方法を変更しようとした

has_many :actor_on_videos 
has_many :actors, :through => :actor_on_videos 

accepts_nested_attributes_for :actors 

video.rbに:ええ、あなたはそのために私を頼むかもしれない

def actors_list=value 
    #Clear for existing videos 
    self.actors.clear 

    value.split(',').each do |actorname| 
    if existing = Actor.find_by_name(actorname.strip) 
     self.actors << existing 
    else 
     self.actors << Actor.create!(:name => actorname.strip) 
    end 
    end 
end 

をそして、それは俳優を作成し、ビデオの保存に失敗した場合は、アクタを作成しないでください。

このように間違っていますか?それとも、私は何かを見逃してしまった?

答えて

1

これを試してみてください:そんなに

class Video < ActiveRecord::Base 

    has_many :actor_on_videos 
    has_many :actors, :through => :actor_on_videos 

    attr_accessor :actors_list 
    after_save :save_actors 

    def actors_list=names 
    (names.presence || "").split(",").uniq.map(&:strip).tap do |new_list| 
     @actors_list = new_list if actors_list_changes?(new_list) 
    end 
    end 

    def actors_list_changes?(new_list) 
    new_record? or 
     (actors.count(:conditions => {:name => new_list}) != new_list.size) 
    end 

    # save the actors in after save. 
    def save_actors 
    return true if actors_list.blank? 
    # create the required names 
    self.actors = actors_list.map {|name| Actor.find_or_create_by_name(name)} 
    true 
    end 
end 
+0

感謝を!すばらしく動作します。私はそれを動作させるために変更を加えなければならなかったいくつかの編集提案を投げた –

+0

@KyleMacey、あなたがしなければならない編集は何ですか? –

+0

あなたの担当者と一緒にそれらを見ることができると思いました。私はまだ自分自身ではない。ここに行く>> http://pastebin.com/2LaXGe4G –

0

idを持たないオブジェクトに子を割り当てることはできません。新しいビデオオブジェクトにアクターを保存し、ビデオが保存されIDがある場合は、それらのレコードを保存する必要があります。

関連する問題