如何覆盖 Rails 模型中的列?

发布于 2024-11-05 04:08:41 字数 256 浏览 1 评论 0原文

我有一个数据库表的模型。我想覆盖该特定表的列名。我将如何实现它。

例如,让我的表名为 DUMMY,它有一个名为 col_a 的列,

col_a
20
34
42
23
12

我将执行 @dummy.col_a。现在,对于以 0 结尾的数字,此方法应该返回 0,对于其他所有内容,它应该返回原始值。我可以通过定义一个新方法来做到这一点,但我想覆盖列名本身。请帮忙。

I have a model for one of my database tables. I want to override the column name for that particular table. How would I achieve it.

For example, let my table be called DUMMY and it has one column called col_a

col_a
20
34
42
23
12

I would be doing a @dummy.col_a. Now this method should return me 0 for numbers ending with 0 and for everything else, it should return the original value. I could do that by defining a new method, but I want to override the column name itself. Please help.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

扛起拖把扫天下 2024-11-12 04:08:41

您可以重写 col_a 方法。使用 read_attribute 读取数据库中值的方法。像这样的东西:

def col_a
  if self.read_attribute(:col_a).to_s.end_with?('0')
    0
  else
    self.read_attribute(:col_a)
  end
end

You can override the col_a method. Use the read_attribute method to read the value in database. Something like this:

def col_a
  if self.read_attribute(:col_a).to_s.end_with?('0')
    0
  else
    self.read_attribute(:col_a)
  end
end
妄想挽回 2024-11-12 04:08:41

您可以简单地定义一个与列同名的方法。要获取实际的列值,请使用 self[column_name]。所以像这样的东西应该可以工作:(

class Dummy < ActiveModel::Base
  def col_a
    self[:col_a] % 10 == 0 ? 0 : self[:col_a]
  end
end

这假设 col_a 是一个整数。)

You can simply define a method of the same name as the column. To get the actual column value, use self[column_name]. So something like this should work:

class Dummy < ActiveModel::Base
  def col_a
    self[:col_a] % 10 == 0 ? 0 : self[:col_a]
  end
end

(This assumes col_a is an integer.)

一念一轮回 2024-11-12 04:08:41

我来晚了一点,但一个非常优雅的方法是简单地使用 super

class Dummy < ApplicationRecord
  def col_a
    super % 10 === 0 ? 0 : super
  end
end

I'm a little late to the party here, but a really elegant way to do it is to simply use super

class Dummy < ApplicationRecord
  def col_a
    super % 10 === 0 ? 0 : super
  end
end
灯下孤影 2024-11-12 04:08:41

您可以通过覆盖默认访问器(如文档中所述)来实现此目的。所有列值都可以通过 Active Record 对象上的基本访问器自动获得,但有时您希望专门化此行为。这可以通过覆盖默认访问器(使用与属性相同的名称)并调用 read_attribute(attr_name) 和 write_attribute(attr_name, value) 来实际更改内容来完成。

滚动到覆盖默认访问器部分以获取更多信息。

You can achieve that by overwriting default accessors as described in the documentation. All column values are automatically available through basic accessors on the Active Record object, but sometimes you want to specialize this behavior. This can be done by overwriting the default accessors (using the same name as the attribute) and calling read_attribute(attr_name) and write_attribute(attr_name, value) to actually change things.

Scroll to the Overwriting default accessors section for more info.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文