Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby ActiveRecordRails 4的默认读取器_Ruby_Ruby On Rails 4_Methods_Overriding_Reader - Fatal编程技术网

Ruby ActiveRecordRails 4的默认读取器

Ruby ActiveRecordRails 4的默认读取器,ruby,ruby-on-rails-4,methods,overriding,reader,Ruby,Ruby On Rails 4,Methods,Overriding,Reader,ActiveRecord是否有任何默认的读卡器方法,以便每当我从DB中获取值时,都会调用此读卡器方法(Property.last.name或Student.first.course)。我想重写这个方法,如果数据类型是字符串,则将其转换为大写。我不想在每个模型中为每个列添加单独的getter 例如: def reader(column) column.upcase if column.is_a? String end 有一个方法ActiveRecord::AttributeMethods::

ActiveRecord是否有任何默认的读卡器方法,以便每当我从DB中获取值时,都会调用此读卡器方法(Property.last.nameStudent.first.course)。我想重写这个方法,如果数据类型是字符串,则将其转换为大写。我不想在每个模型中为每个列添加单独的getter

例如:

def reader(column)
  column.upcase if column.is_a? String
end

有一个方法
ActiveRecord::AttributeMethods::Read#Read_attribute
,它在键入值后返回该值。所以猴子修补(或精炼)这个方法可能会给你你想要的-所有的字符串值都会被转换

但我会认真地重新考虑这种方法:如果你不想自食其果,那么所有的数据转换都应该是显式的和可见的

这并不意味着您无法避免手动重新定义getter。例如,您可以执行smth。像这样(免责声明:快速肮脏的例子):

模块转换值
def变换(*属性_到_变换,变换器:nil和block)
属性_到_转换。每个do |属性_名称|
定义\u方法属性\u名称do
外壳变压器=(块| |变压器)
当程序
transformer.call(self[attribute\u name])
当符号
self[属性\名称]。\发送\发送(转换器)
其他的
自我[属性名称]
结束
结束
结束
结束
结束
#然后
类用户
在这种情况下,您的所有转换或多或少都是显式的,没有大量手动编写的样板文件。如果您只需要升级字符串,那么所有这些都可以简化为smth。像

模块属性
def always_upcase(*属性_到_转换)
属性_到_转换。每个do |属性_名称|
定义\u方法属性\u名称do
案例值=自身[属性名称]
当字符串
value.upcase
其他的
价值
结束
结束
结束
结束
结束
类用户
这有帮助吗?谢谢但是如果我添加一个新字段,我需要添加一个新的getter,这不是我想要的。我需要一个默认的getter方法,该方法将适用于所有可以重写的字段。根据您的数据库类型,可以在数据库连接级别设置此方法。你在用什么数据库?谢谢。但这对self.read或self.read\u属性有效吗?例如:@property.read\u属性(“名称”)