gpt4 book ai didi

ruby-on-rails - 如何将参数的默认反序列化覆盖到模型对象?

转载 作者:太空宇宙 更新时间:2023-11-03 18:24:54 25 4
gpt4 key购买 nike

如何覆盖模型对象参数的默认反序列化?换句话说,如何让 Rails 理解带有蛇形数据库的驼峰式 JSON?

示例:我收到带有字段 fooBar 的参数 Foo 对象,我希望我的 Foo 模型能够理解 fooBar 实际上是数据库字段 foo_bar

"Foo": {
"fooBar": "hello" /* fooBar is database field foo_bar */
}
class Foo < ActiveRecord::Base
attr_accessible :foo_bar
end

class FoosController < ApplicationController
def new
@foo = Foo.new(params[:foo])
end

Foo.new(params[:foo]) 假定 params[:foo] 包含 foo_bar。相反,params[:foo] 包含 fooBar(在我的例子中,params 包含 JSON 数据)。

我想要一种干净的方式来处理这种情况,就像模型可以覆盖 as_json 的方式一样:

class Foo < ActiveRecord::Base
attr_accessible :foo_bar, :another_field

def as_json(options = nil)
{
fooBar: foo_bar,
anotherField: another_field
}
end
end

有一个from_json method inside ActiveModel但当 Foo.new(params[:foo]) 运行时它不会被调用。

我读过好几遍,从模型对象覆盖 initialize 是个糟糕的主意。

最佳答案

Foo.new 对您提供的参数散列所做的所有操作都是迭代该散列中的键和值。如果键是 foo_bar,那么它会尝试用值调用 foo_bar=

如果您定义一个设置self.foo_barfooBar= 方法,那么您将能够传递一个带有键值:fooBar 的散列> 到 Foo.new

少手动,你可以做

class Foo < ActiveRecord::Base
alias_attribute :fooBar, :foo_bar
end

它为您生成所有额外的访问器。

我不会说重写 initialize 是一件糟糕的事情,但正确地做起来可能很棘手,而且几乎总有一种更简单的方法或一种让您的意图更清晰的方法。

关于ruby-on-rails - 如何将参数的默认反序列化覆盖到模型对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12750125/

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