我正在通过以下方式将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
答案 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中生成并行节点(对象)。