0

我通过以下方式将用户对象转换为 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
4

1 回答 1

0

我不确定该:includes => :fortune选项是否按您期望的那样工作(或者可能根本没有)——在当前 Rails 指南本节的末尾附近,它提到了除.all.

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

正如我在评论中指出的那样,我认为as_json会做你想做的事——它定义了在使用to_json. 您指定除了(或排除)数据支持的对象本身的方法之外应该调用的方法,例如,您的new_cookies方法。

在这个例子中,我添加了as_jsonto User(获取 Cookie)和 to 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 中生成并行节点(对象)。

于 2012-11-28T14:48:53.413 回答