gpt4 book ai didi

ruby-on-rails - 为什么在使用命名空间时在关联中指定完整的类名很重要

转载 作者:行者123 更新时间:2023-12-04 17:05:04 25 4
gpt4 key购买 nike

在我的 Rails 应用程序中,有一个模型有一些 has_one关联(这是一个捏造的例子):

class Person::Admin < ActiveRecord::Base
has_one :person_monthly_revenue
has_one :dude_monthly_niceness
accepts_nested_attributes_for :person_monthly_revenue, :dude_monthly_niceness
end

class Person::MonthlyRevenue < ActiveRecord::Base
belongs_to :person_admin
end

class Dude::MonthlyNiceness < ActiveRecord::Base
belongs_to :person_admin
end

该应用程序与计算一些数据并返回一段 JSON 的后端对话,如下所示:
{
"dude_monthly_niceness": {
"february": 1.1153232569518972,
"october": 1.1250217200558268,
"march": 1.3965786869658541,
"august": 1.6293418014601631,
"september": 1.4062771500697835,
"may": 1.7166279693955291,
"january": 1.0086401628086725,
"june": 1.5711510228365859,
"april": 1.5614525597326563,
"december": 0.99894169970474289,
"july": 1.7263264324994585,
"november": 0.95044938418509506
},
"person_monthly_revenue": {
"february": 10.585596551505297,
"october": 10.574823016656749,
"march": 9.9125274764852787,
"august": 9.2111604702328922,
"september": 9.7905249446675153,
"may": 9.1329712474607962,
"january": 10.479614016604238,
"june": 9.3710235926961936,
"april": 9.5897372624830304,
"december": 10.052587677671438,
"july": 8.9508877843925561,
"november": 10.925339756096172
},
}

为了反序列化它,我使用 ActiveRecord 的 from_json ,而不是 Person::Admin对象的所有关联到位,我收到此错误:
>> Person::Admin.new.from_json(json)
NameError: uninitialized constant Person::Admin::DudeMonthlyNiceness

难道我做错了什么?

有没有更好的方法来反序列化数据? (我可以轻松修改后端)

更新 :原标题是“如何从 json 反序列化为具有关联的 ActiveRecord 对象?”但最终是我指定关联的错误,所以我更改了标题。

最佳答案

您的类位于不同的命名空间中。 ActiveRecord 转换 dude_monthly_niceness进入 DudeMonthlyNiceness当前命名空间内的类,它给出 Person::Admin::DudeMonthlyNiceness ,它不存在。

因此,您应该为关联明确指定类名(不知道您使用的究竟是什么外键,因此需要时进行更改):

class Person::Admin < ActiveRecord::Base
has_one :person_monthly_revenue, :class_name => "Person::MonthlyRevenue", :foreign_key => "person_admin_id"
has_one :dude_monthly_niceness, :class_name => "Dude::MonthlyNiceness", :foreign_key => "person_admin_id"
accepts_nested_attributes_for :person_monthly_revenue, :dude_monthly_niceness
end

另一件事是能够使用 accepts_nested_attributes_for 接收关联对象,你需要用_attributes结束你的json对象:
{
"dude_monthly_niceness_attributes": {
"february": 1.1153232569518972,
...
"november": 0.95044938418509506
},
"person_monthly_revenue_attributes": {
"february": 10.585596551505297,
...
"november": 10.925339756096172
},
}

关于ruby-on-rails - 为什么在使用命名空间时在关联中指定完整的类名很重要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2876019/

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