Rails中没有循环的自定义获取器和设置器

时间:2019-01-24 19:32:19

标签: ruby-on-rails

我有一个Airports数据库,其中有一个region“属性”。我以前曾使用region方法Airport#region管理Region属性,该方法根据机场的属性查找Airport belongs_to :region对象。

我现在添加了正式关系,以便Airports。 当然,我现有的所有nil当前都具有regions Airport#region。我已将旧的Airport#set_region方法重命名为region ? region : set_region

我想要一个自定义吸气剂,它基本上可以region ||= set_region,也称为region = set_region。但是,当然,然后我得到一个循环。

set_region可以完成工作,但是效率很低,因为我想它可以执行region,即使已经分配了set_region

如果需要,我还希望能够设置“自定义”区域(以覆盖region = reg save 会“计算”的任何内容)。以下解决方案不起作用。

第一个设置区域(在方法中的撬动会话中可见),但不会以某种方式保留,只要控制权返回到调用它的规范即可。

update(region: reg)

这只是循环。

{{1}}

1 个答案:

答案 0 :(得分:0)

我自己弄清楚了。使用region_id绕过Rails提供的辅助方法#region#region=

  def region
    if region_id
      Region.find(region_id)
    else
      region = set_region
    end
  end

  def region=(reg)
    update(region_id: reg.id)
  end

我很想知道是否有人知道这样做的不同方法。

我也非常想知道是否有办法让Region.find(nil)返回nil而不是抛出错误,所以我可以只做Region.find(region_id) || set_region

编辑:回答我刚刚问的问题(您知道,两行之前)-TADA!

  def region
    Region.find_by(id: region_id) || set_region
  end