因此,我知道如何使用

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

我希望method f.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

然而,这将始终进行db调用,即使已经获取了Bar,这肯定不是理想的.

有人知道我是如何建立一种关系的吗?这种关系使得"属于"属性只被加载一次,如果没有设置,则会有一个默认值.

推荐答案

alias_method是你的朋友.

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

其工作方式是将默认的"bar"方法别名为"original bar",然后实现自己版本的"bar".如果对original_bar的调用返回nil,则返回最后一个bar实例.

Ruby-on-rails相关问答推荐

在VP中部署rails 7和nginx

在Ruby on rails中,重复访问ActiveRecordModel返回相同的对象:预期行为还是错误?

在控制器操作中适当使用ActiveModel Dirty

SASS,Rails 7:找不到要导入的样式表

Rails 7,返回具有两个单独条件的活动记录关联,一个在父级,一个在子级

ActiveRecord::声明在类别中无效#new

如何为 I18n 设置 raise_on_missing_translations

Restful Rails 编辑与更新

如何使用 Rails 3 / Rack 在没有 www 的情况下重定向?

attr_accessible(*attributes) 和 attr_protected(*attributes) 有什么区别?

回形针图片网址

如何将 Ruby 哈希转换为 XML?

搭建脚手架时建立关系

在 rake 任务期间关闭观察者的简单方法?

如何在特定时区(最好是我的应用程序的默认时区,而不是 UTC)中创建新的 DateTime 对象?

导轨链接到:远程

我可以在 twitter-bootstrap popover 数据内容中使用 html 标签吗?

redirect_to 和 render 是可交换的吗?

Ruby 安装的 RVM 不工作?

即使X-Frame-Options为ALLOWALL,也无法在 iframe 中显示我的 rails 4 应用程序