Почему важно указывать полное имя класса в вашей ассоциации при использовании пространств имен - PullRequest
0 голосов
/ 20 мая 2010

В моем приложении на 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 с ассоциациями?» но это оказалось моей ошибкой в ​​определении ассоциаций, поэтому я сменил название.

1 Ответ

1 голос
/ 20 мая 2010

Ваши классы находятся в разных пространствах имен. 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 , вам необходимо завершить ваши объекты json с помощью _attributes:

{
    "dude_monthly_niceness_attributes": {
        "february": 1.1153232569518972, 
        ...
        "november": 0.95044938418509506
    }, 
    "person_monthly_revenue_attributes": {
        "february": 10.585596551505297, 
        ...
        "november": 10.925339756096172
    }, 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...