问题
是否有内置的API、第三方Gem或在Rails应用程序中应用数据到数据库和从数据库转换的通用范式?
注意:我不是在寻找助手、视图模型或标准的before
/after
ActiveRecord挂钩。我需要能够在通常的挂钩下静默地更改数据,以便该机制对应用程序的其他部分是解耦/隐藏/未知的
换句话说,我希望在ActiveRecord中的普通挂钩下方和数据库适配器上方的某个位置按每个属性插入一个填充程序,这将允许我透明地处理数据,就像数据库适配器的序列化程序一样。
琐碎的例子
$ rails new test-app
$ cd test-app
$ bundle install
$ bundle exec rails g scaffold vehicle make model year:integer color
$ bundle exec rake db:migrate
在app/models/vehicle.rb
中,类似于:
class Vehicle < ActiveRecord::Base
magic_shim :color, in: :color_upcase, out: :color_downcase
private
# Returns a modified value for storage but does not change the
# attribute value in the ActiveRecord object.
def color_upcase
self.color.upcase
end
# Accepts the stored value and returns an inversely modified version
# to be used by the ActiveRecord attribute.
def color_downcase(stored)
stored.downcase
end
end
在轨道控制台中(注意"红色"的大写):
irb> truck = Vehicle.create make: "Ford", model: "F150", year: 2015, color: "Red"
在rails数据库中(颜色在存储前已升级):
sqlite> SELECT * FROM `vehicles`;
1|Ford|F150|2015|RED|2015-06-24 16:07:33.176769|2015-06-24 16:07:33.176769
回到控制台(该应用程序看到了一个下降的版本):
irb> truck = Vehicle.find 1
irb> truck.color
=> red
(从注释移到答案)
在这种情况下,覆盖默认访问器可以解决问题。更多信息和实现代码示例:http://api.rubyonrails.org/classes/ActiveRecord/Base.html#class-ActiveRecord%3a%3基本标签覆盖+默认+访问者