2011-07-29 5 views
1

私はRubyの初心者ですので、これらのいくつかが完全に無知であれば許してください。 「私はドンRailsのモデルアソシエーションを設定する - 孫側から保存する

  • 転写は、組成物に属し
  • 組成物は、多くのトランスクリプションを持っている、
  • アーティスト(組成物を通って、書き起こし)多くの組成物を持っているアーティスト
  • に属し

を:私は、次の関連付けを設定したいですコンポジションやアーティストを作成するためのスタンドアロンのフォームが必要です。ユーザーは単に転写を作成するだけです。転写のためのフォームはアーティストのテキストフィールドを持ち、構成とデータベースエントリは動的に作成する必要があります(存在しない場合)。

モデルを設定するにはどうすればよいですか?私は転写でいくつかの仮想属性を使うべきですか?

# transcription.rb 
def artist_name 
    artist.name if self.artist 
end 

def artist_name=(name) 
    self.artist = Artist.find_or_create_by_name(name) unless name.blank? 
end 

以降私が見つけたか、以前に作成したアーティストを使用してfind_or_create_by_nameを有する組成物を作成しますか?

事前に感謝します

答えて

1

アーティストには、作曲はたくさんあり、作曲ではないため、作曲家にはアクセスする必要があります。私はこのコードがそれをより良く説明することを願っています

私は疲れて、おそらく何かを台無しだが、ここに私達は行く(テストしていません):

# transcription.rb 

attr_writer :composition_name, :artist_name 
before_save :set_artist_and_composition 
validates_presence_of :artist_name, :composition_name 

def composition_name 
    composition.name 
end 

def artist_name 
    composition.artist.name 
end 

def set_artist_and_composition 
    artist = Artist.find_or_create_by_name(@artist_name) 
    self.composition = Composition.find_or_create_by_name(@composition_name) 
    self.composition.artist = artist 
end 
+0

おかげでたくさん!あなたのコードはほぼ完璧で、うまくいくように見せてくれました。 attr_readerとフォームに問題がありました(コンポジションやアーティストが初期化されていないと失敗します)。 http://pastebin.com/7WvCaDBZ 私は常にアーティストと作曲のユニークなペアを持ちたいので、これを保存に変更しました:http: //pastebin.com/ZapzvBF5 – chodorowicz

+0

これを行うより良い方法は、composition_nameまたはartist_nameをまったく使用しないことです。単にtranscription.composition.artist.nameとtranscription.composition.nameにアクセスしてください。 「ネストされたフォーム」について読むと、良いアイデアが得られるはずです。 http://guides.rubyonrails.org/2_3_release_notes.html#nested-object-formsもし何か手間がかかっているようであれば、それを行う良い方法があります。 –

+0

私の指導のために再びありがとう。ネストされたフォームのほとんどすべての例は、フォーム内に子モデルがある場合に発生するため、現在のソリューションではおそらく時間を置いています。私は反対方向にそれを持っています(belongs_toはメインモデルです)。 belongs_toモデルがフォームの主なモデルである場合、私はいくつかの例を見出しましたが、私は2つのレベルの深い関連性を持つ例は見つかりませんでした。これは複雑になる可能性があります... – chodorowicz

関連する問題