Rails has_one:通过.构建关联对象

Bar*_*cha 6 activerecord ruby-on-rails

我的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
Run Code Online (Sandbox Code Playgroud)

我想使用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>
Run Code Online (Sandbox Code Playgroud)

我不确定我做错了什么.通过Rails指南查看看起来这应该是可能的has_one关系.任何帮助将不胜感激.

rov*_*ver 0

为什么不做以下事情呢。

class Portrait
  belongs_to :portrait_subject
  belongs_to :asset

  ...
end
Run Code Online (Sandbox Code Playgroud)

-

class PrimaryPortrait < Portrait
  ...
end
Run Code Online (Sandbox Code Playgroud)

-

class SupplementaryPortraits < Portrait
  ...
end
Run Code Online (Sandbox Code Playgroud)

-

class PortraitSubject
  has_one     :primary_portrait
  has_many    :supplementary_portraits
  ...
end
Run Code Online (Sandbox Code Playgroud)

这更紧密地遵循 Rails 设计模式。不过,您必须添加一个类型列。