Rails:将嵌套属性映射到模型的对象

时间:2012-12-30 08:55:34

标签: ruby-on-rails ruby

# models
class A < ActiveRecord::Base
    has_many :b

class B < ActiveRecord::Base
    belongs_to :a

# controllers
class aController < ApplicationController
    def a_with_b
        @a_with_b = A.find(1, :include => [:b])
        puts @a_with_b # => #<A id:1> // `b` not mapped to `@a_with_b`
        puts @a_with_b.b # => [#<B id:1>, #<B id:2>] // still there's `b`
    end
end

问题:
 b如何映射到@a_with_b
 预期:

puts @a_with_b # => #<A id:1 b:[#<B id:1>, #<B id:2>] >

上面写的所有内容的实际原因是能够获得具有适当结构的序列化对象: e.g。

{something: true, nothing: false, a: @a_with_b}.to_xml # =>

<xml>
  <something>true</something>
  <nothing>false</nothing>
  <a>
    <id>1</id>
    <bs>
      <b> <id>1</id> </b>
      <b> <id>2</id> </b>
    </bs>
  </a>
<xml>

Rails v.2.3

2 个答案:

答案 0 :(得分:1)

如果要在JSON中序列化数据,可以这样做:

@a_with_b = A.find(1, :include => [:b])
puts @a_with_b.to_json(:include => [:b]) # return a JSON encoded string
puts @a_with_b.as_json(:include => [:b]) # return a Hash

答案 1 :(得分:0)

我只是花了一些时间来讨论这个实现,看起来发生的事情是从数据库中提取数据,并将其放入activerecord对象缓存中,这样如果你引用它们,它就不会需要数据库查询。 的对象最终以你想要的方式嵌套,但我想不出这应该是一个问题的原因。

换句话说,除非您发现生成的SQL查询不符合您的期望,否则这可能是您想要的行为。