gpt4 book ai didi

ruby-on-rails - 如何将 ActiveRecord 属性转换为数据库或从数据库转换?

转载 作者:搜寻专家 更新时间:2023-10-30 23:44:13 25 4
gpt4 key购买 nike

问题

是否有内置 API、第 3 方 Gem 或通用范例,用于在 Rails 应用程序中对数据进出数据库进行转换?

注意:我不是在寻找助手、 View 模型或标准的 before/after ActiveRecord Hook 。我需要能够在通常的钩子(Hook)“下面”悄悄地改变数据,以便该机制对应用程序的其余部分解耦/隐藏/未知。

换句话说,我想在 ActiveRecord 中的某个地方插入一个 shim,位于普通 Hook 下方,以及基于每个属性的数据库适配器上方的某个位置,这将允许我透明地修改数据,就像序列化程序一样数据库适配器。

简单的例子

$ 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

在 Rails 控制台中(注意“Red”的大写):

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%3aBase-label-Overwriting+default+accessors

关于ruby-on-rails - 如何将 ActiveRecord 属性转换为数据库或从数据库转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31031987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com