6

Rails 2.3 アプリケーションに次のデータ モデルがあります。

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

関連するプロキシ モデルを Rails を使用して構築したいのですが、構築しようとするprimary_portraitと例外が発生して失敗します。いえ

# 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. どんな助けでも大歓迎です。

4

3 に答える 3

1

これらの命名規則に夢中になるでしょう。APrimaryPortraitと aは、 aに属する資産ではないSecondaryPortrait特殊なケースである必要があります。設計を構築できないということは、すでに設計を壊しています。PortraitPortrait

これを試して:

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

primary_portait_asset次に、インスタンスメソッドを作成する必要がある場合

def build_primary_portrait_asset
  primary_portrait || build_primary_portrait
  primary_portrait.asset || primary_portrait.build_asset
end
于 2013-08-05T17:17:09.327 に答える
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

于 2013-05-15T13:20:07.037 に答える
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

これは、Rails の設計パターンにより厳​​密に従います。ただし、タイプ列を追加する必要があります。

于 2013-04-08T19:45:22.337 に答える