ActiveRecord to_json包括:methods中的关联

时间:2012-11-27 18:54:22

标签: ruby-on-rails ruby activerecord

我正在通过以下方式将User对象转换为json:

user.to_json :methods => :new_cookies

new_cookies方法是:

cookies.all :include => :fortune, :conditions => {:opened => false}

这将cookie嵌入到用户json对象中,但我也希望将幸运嵌入到cookie对象中。我通过了:include => :fortune,但那不起作用。

这可能吗?

型号:

class User < ActiveRecord::Base
    has_many :cookies
    has_many :fortunes, :through => :cookies

    def new_cookies
        cookies.all :include => :fortune, :conditions => {:opened => false}
    end
end

class Cookie < ActiveRecord::Base
    belongs_to :user
    belongs_to :fortune
end

class Fortune < ActiveRecord::Base
    serialize :rstatuses
    serialize :genders 

    has_many :cookies
    has_many :users, :through => :cookies
end

1 个答案:

答案 0 :(得分:0)

我不确定:includes => :fortune选项是否按预期(或可能根本)工作 - 在this section of the current Rails guides的末尾附近,它为.all以外的查找器方法提及此选项。

我认为它与新的Active Relation查询接口的工作方式类似,例如: Cookies.include(:fortunes).where(:opened => false) - 在这种情况下,Rails“急切地加载”相关记录,这意味着作为cookie查询的一部分提取了财富。这是性能增强,但不会改变Rails的行为。

正如我在评论中所指出的,我认为as_json会做你想做的事情 - 它定义了使用to_json序列化时对象的内容和不是对象的一部分。除了(或排除)数据支持对象本身的方法之外,还应指定应调用的方法,例如,new_cookies方法。

在这个示例中,我已将as_json添加到User(获取Cookie),还添加到Cookie,希望每个Cookie都能将其财富嵌入其JSON中。请参阅下面的替代方案。

class User < ActiveRecord::Base
  has_many :cookies
  has_many :fortunes, :through => :cookies

  def as_json(option = {})
    super(:methods => :new_cookies)
  end

  def new_cookies
    cookies.all :conditions => {:opened => false}
  end
end

class Cookie < ActiveRecord::Base
  belongs_to :user
  belongs_to :fortune

  def as_json(options = {})
    super(:methods => :cookie_fortune)  # or perhaps just :fortune 
  end

  def cookie_fortune
    self.fortune
  end
end

在我编写API并且不需要反映JSON中对象之间的嵌套关系的情况下,在控制器中,我使用了类似

的内容
respond_to do |format|
  format.html 
  format.json { render json: { :foo => @foo, :bar => @bar }}
end

在JSON中生成并行节点(对象)。