代码之家  ›  专栏  ›  技术社区  ›  Carmine Paolino

为什么在使用名称空间时在关联中指定完整的类名很重要

  •  0
  • Carmine Paolino  · 技术社区  · 16 年前

    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
        }, 
    }
    

    from_json ,而不是 Person::Admin 对象的所有关联就绪后,我得到以下错误:

    >> Person::Admin.new.from_json(json)
    NameError: uninitialized constant Person::Admin::DudeMonthlyNiceness
    

    有没有更好的方法来反序列化数据(我可以很容易地修改后端)

    更新 :最初的标题是“如何将json反序列化为具有关联的ActiveRecord对象?”,但它最终是我指定关联时的错误,因此我更改了标题。

    1 回复  |  直到 16 年前
        1
  •  1
  •   Tatjana N.    16 年前

    您的类位于不同的名称空间中。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对象:

    {
        "dude_monthly_niceness_attributes": {
            "february": 1.1153232569518972, 
            ...
            "november": 0.95044938418509506
        }, 
        "person_monthly_revenue_attributes": {
            "february": 10.585596551505297, 
            ...
            "november": 10.925339756096172
        }, 
    }
    
    推荐文章