ruby-on-rails - Rails 覆盖关系的默认 getter (belongs_to)

标签 ruby-on-rails activerecord associations default-value

所以我知道如何使用覆盖 ActiveRecord 对象属性的默认 getter

def custom_getter
  return self[:custom_getter] || some_default_value
end

我正在努力实现同样的目标,但是对于属于协会。例如。

class Foo < AR
  belongs_to :bar

  def bar
    return self[:bar] || Bar.last
  end
end

class Bar < AR
  has_one :foo
end

当我说:

f = Foo.last

我想让方法 f.bar 返回最后一个 Bar,而不是 nil(如果该关联尚不存在)。

但这不起作用。原因是 self[:bar] 始终是未定义的。它实际上是 self[:bar_id]。

我可以做一些天真的事情,比如:

def bar
  if self[:bar_id]
    return Bar.find(self[:bar_id])
  else
    return Bar.last
  end
end

但是,即使已经获取了 Bar,这也总是会进行数据库调用,这当然不理想。

有谁知道我如何建立一种关系,使得belongs_to属性仅加载一次,并且如果未设置则具有默认值。

最佳答案

alias_method 是你的 friend 。

alias_method :original_bar, :bar
def bar
  self.original_bar || Bar.last
end

其工作方式是将默认的“bar”方法别名为“original bar”,然后实现您自己的“bar”版本。如果对original_bar的调用返回nil,那么您将返回最后一个Bar实例。

关于ruby-on-rails - Rails 覆盖关系的默认 getter (belongs_to),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2500775/

相关文章:

mysql - 在没有 Arel 的情况下如何在 Rails 中编写此查询

ruby - Ruby Activerecord 中的组合更新

java - 为什么我会收到 org.hibernate.id.IdentifierGenerationException?

ruby-on-rails - 避免服务器卡在 SSE(服务器发送事件)

javascript - 选择类别然后显示类别.尺寸

ruby-on-rails - before_save中设置参数

ruby-on-rails - 确保 has_many :through association is unique on creation

ruby-on-rails - 如何在 Rails 3 中创建自定义 "association methods"?

ruby-on-rails - Rails - 如何检查条件单选按钮?

ruby-on-rails - nested_form、collection_select、accepts_nested_attributes_for 和 fields_for,以及将记录添加到连接表