0
# 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>] >

上面写的所有实际原因是能够获得具有适当结构的序列化对象:例如

{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>

导轨 v.2.3

4

2 回答 2

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
于 2012-12-30T11:07:51.300 回答
0

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

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

于 2012-12-30T09:27:39.163 回答