2013-04-08 4 views
6

私はRailsのを使ってますがprimary_portraitは例外で失敗構築しようとして関連付けられたプロキシモデルを構築したい私のRails 2.3のアプリケーションRails has_one:through。ビル関連するオブジェクト

class PortraitSubject 
    has_many :portraits 
    has_one  :primary_portrait, :through => :portraits, :source => :asset, :conditions => ['portraits.primary = ?', true] 
    has_many :supplementary_portraits, :through => :portraits, :source => :asset, :conditions => ['portraits.primary = ?', false] 

    ... 
end 

class Portrait 
    belongs_to :portrait_subject 
    belongs_to :asset 

    ... 
end 

で以下のデータモデルを持っています。私。

# This works 
subject = PortraitSubject.new 
subject.supplementary_portraits.build 
subject.save 

# This doesn't 
subject = PortraitSubject.new 
subject.build_primary_portrait 
# => NoMethodError: undefined method `build_primary_portrait' for #<PortraitSubject:0x007ff16fe38948> 

私が間違っていることはわかりません。 Railsのガイドを見ると、has_oneの関係でこれが可能であるように見えます。どんな助けでも大歓迎です。

+1

を書く:

はこれを試してみてください?あなたがリンクを提供している場合は – Zippie

答えて

0

どうすればよいですか?

class Portrait 
    belongs_to :portrait_subject 
    belongs_to :asset 

    ... 
end 

-

class PrimaryPortrait < Portrait 
    ... 
end 

-

class SupplementaryPortraits < Portrait 
    ... 
end 

-

class PortraitSubject 
    has_one  :primary_portrait 
    has_many :supplementary_portraits 
    ... 
end 

これは、より密接にレールのデザインパターンに従います。あなたはタイプの列を追加する必要があります。

0

私は2つの団体にこれを分割することをお勧めしたい:

class PortraitSubject 
    has_many :portraits 
    has_one  :primary_portrait, :class_name => "Portrait", :conditions => ['portraits.primary = ?', true] 
    has_one  :primary_portrait_asset, :through => :primary_portrait, :source => :asset 

    has_many :supplementary_portraits, :class_name => "Portrait", :conditions => ['portraits.primary = ?', false] 
    has_many  :supplementary_portrait_assets, :through => :supplementary_portraits, :source => :asset 

    ... 
end 

次にあなたが肖像画のモデルを作成するためにsubject.build_primary_portraitを使用し、subject.primary_portrait_assetを通じて資産にアクセスすることができます。

1

あなたはこれらの命名規則に夢中になります。 PrimaryPortraitSecondaryPortraitは、Portraitに属するアセットではなく、Portraitの特殊なケースである必要があります。すでにデザインを壊しているため、作成できません。 through`の関連付けを:あなたは `構築することができます確信しているあなたはprimary_portait_assetを構築する必要があるならば、

class PortraitSubject 
    has_many :portraits 
    has_one  :primary_portrait, :conditions => {:primary => true} 
    has_many :supplementary_portraits, :conditions => {:primary => false} 

    has_many :portrait_assests, :through => :portraits 
    has_one  :primary_portrait_asset, :through => :primary_portrait 
    has_many :supplementary_portrait_assets, :through => :supplementary_portraits 

end 

は、インスタンスメソッド

def build_primary_portrait_asset 
    primary_portrait || build_primary_portrait 
    primary_portrait.asset || primary_portrait.build_asset 
end 
関連する問題