Ruby on rails RubyonRails-方法名称与ActiveRecord方法相同

Ruby on rails RubyonRails-方法名称与ActiveRecord方法相同,ruby-on-rails,activerecord,ruby-on-rails-2,Ruby On Rails,Activerecord,Ruby On Rails 2,在我的Rails模型中,我有一个描述方法: 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方法,该方法基于该模型的其他属性返回一些有用的信息 我刚刚意识

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

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
时传递一个参数,例如

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
方法并终止(假设调用
description
时传递了
1


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

我肯定会重命名您的自定义
说明
方法

Ruby有“super”的概念,它允许您在父类或模块中调用方法。在Rails中,活动记录允许您通过重写“column方法”来利用这一点,并且仍然可以通过调用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

在模型中使用
read_attribute
方法强制它获取DB方法。您也可以使用
super
。或列,无论哪个更容易或更适合应用程序的一致性。我同意,这可能是最好的选择,但我只需要在一个位置执行覆盖,与重命名列或自定义描述方法所需的更改量相比,@martincarlin87我认为重命名值得一试。如果你做更多这样的黑客,你的代码很快就会看起来像垃圾。啊,太好了,非常感谢。我希望Rails-y能做点什么,但就是找不到。@martincarlin87如果这对你有效,请接受答案,让别人知道你的问题已经得到了回答。Yep,我总是接受,只是你的回答太快了,我不得不等几分钟(我想答案只能在7分钟后接受)