ActiveRecord `has_one` 关联扩展方法

Posted

技术标签:

【中文标题】ActiveRecord `has_one` 关联扩展方法【英文标题】:ActiveRecord `has_one` association extension method 【发布时间】:2016-09-30 09:23:54 【问题描述】:

我尝试用方法扩展has_one 关联:

has_one :subscription_plan, ->  where current: true  do
  def in newspaper
    where newspaper: newspaper
  end
end

得到一个错误undefined method 'in' for #<SubscriptionPlan...>

但它适用于has_many:

has_many :subscription_plans, ->  where current: true  do
  def in newspaper
    where(newspaper: newspaper).take
  end
end

如何使其在 Rails 4.2.1 上与 has_one 一起使用?

【问题讨论】:

【参考方案1】:

通过访问has_many 关联,您会收到SubscriptionPlan::ActiveRecord_Associations_CollectionProxy,但使用has_one,您只会收到SubscriptionPlan 实例本身。

所以这里没有什么可以扩展的。

如果您愿意提供有关您的模型的更多信息,我会帮助您提供准确的代码。

【讨论】:

非常感谢! ActiveRecord 文档guides.rubyonrails.org/… 有点令人困惑:Extensions can refer to the internals of the association proxy using these three attributes of the proxy_association accessor: ... proxy_association.target returns the associated object for belongs_to or has_one, or the collection of associated objects for has_many or has_and_belongs_to_many.。文档中提到has_one 是否有错误? 我不认为这是一个错误,但现在我不能评论它=)

以上是关于ActiveRecord `has_one` 关联扩展方法的主要内容,如果未能解决你的问题,请参考以下文章

Rails - has_one 关系:关联和非关联对象的范围

为此使用啥 Rails-ActiveRecord 关联?

has_one 表单中的现有数据

ActiveRecord 子类化?

has_one: through: 不添加构造函数

has_one 与用户和客户的关联以及 Rails 视图表单