【问题标题】:Ruby on Rails - Method Name Identical to ActiveRecord MethodRuby on Rails - 方法名称与 ActiveRecord 方法相同
【发布时间】:2013-10-28 12:04:32
【问题描述】:

在我的 Rails 模型中,我有一个 description 方法:

def description
  if self.channels.nil?
    return self.allowed_ip_addresses
  else
    return self.channels.to_s + ' channels - ' + self.allowed_ip_addresses
  end
end

我有很多模型,我在其中创建了一个 description 方法,该方法根据该模型的其他属性返回一些有用的信息。

我刚刚意识到的问题是,这个模型的表中有一个 description 列,所以我只是想知道解决这个问题的最佳方法,我环顾四周,但没有发现任何有用的东西。

我首先想到的是在调用description时传递一个参数,例如

def description(table_value = 0)
  if table_value
    return self.description
  end

  if self.channels.nil?
    return self.allowed_ip_addresses
  else
    return self.channels.to_s + ' channels - ' + self.allowed_ip_addresses
  end
end

但很快意识到这是没有意义的,因为它只会递归调用 description 方法并死掉(假设 1 与对 description 的调用一起传递)。

我也可以更改表列名称,但它在其他地方使用,所以我只是想看看是否有替代解决方案。

【问题讨论】:

  • 使用模型中的read_attribute 方法强制它获取数据库方法。你也可以使用super

标签: ruby-on-rails activerecord ruby-on-rails-2


【解决方案1】:

我肯定会重命名您的自定义 description 方法。

【讨论】:

  • 或列,以更容易或更适合您的应用程序的一致性为准
  • 我同意,这可能是最好的做法,但与我重命名列或自定义描述方法。
  • @martincarlin87 我认为重命名值得付出努力。如果你做更多这样的 hack,你的代码很快就会像垃圾一样。
【解决方案2】:

Ruby 有“超级”的概念,它允许您调用父类或模块中的方法。在 Rails 中,Active Record 允许您通过覆盖“列方法”来利用这一点,并且仍然可以通过调用 super 获取数据库值。您的问题并不清楚您要在什么条件下使用数据库值以及何时要使用自定义逻辑。不过,这里有一些伪代码可以帮助您入门:

def description
  return super if Use Database Value?

  if self.channels.nil?
    return self.allowed_ip_addresses
  else
    return self.channels.to_s + ' channels - ' + self.allowed_ip_addresses
  end
end

【讨论】:

  • 啊,完美,非常感谢。我希望有一些 Rails-y 我可以做的事情,但就是找不到。
  • @martincarlin87 如果这对您有用,请接受答案,以便其他人知道您的问题已得到解答。
  • yip,我总是接受,只是你的答案如此之快,我不得不等待几分钟(认为答案只能在 7 分钟后被接受)
猜你喜欢
  • 1970-01-01
  • 2013-09-25
  • 1970-01-01
  • 1970-01-01
  • 2018-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多