首页 文章

如何覆盖Rails模型中的列?

提问于
浏览
12

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

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

col_a
20
34
42
23
12

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

4 回答

  • 9

    您可以覆盖 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
    
  • 0

    您只需定义与列名称相同的方法即可 . 要获取实际列值,请使用self [column_name] . 所以像这样的东西应该工作:

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

    (这假设col_a是一个整数 . )

  • 4

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

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

  • 27

    我在这里参加派对有点晚了,但是一个非常优雅的方法是简单地使用 super

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

相关问题