Rails:活动记录问题

时间:2011-08-27 08:01:14

标签: ruby-on-rails ruby activerecord associations

我有以下型号:

require 'books_projects.rb'

class Project < ActiveRecord::Base
  has_many :book_to_projects
  has_many :books, :through => :book_to_projects
end

require 'books_projects.rb'

class Book < ActiveRecord::Base
  has_many :book_to_projects
  has_many :projects, :through => :book_to_projects
end

books_projects.rb:

class BookToProject < ActiveRecord::Base
    set_table_name "books_projects"
    belongs_to :book
    belongs_to :project
end

在我的项目控制器中,我正在尝试这样做:

@projects = Project.find(:all, :include => [:books])

我希望得到一个看起来像这样的嵌套数据结构:

projects: [
  {
    ..,
    books: [
        {
          ..
        },
        {
          ..
        }
    ]
  }
]

这不起作用。我怎样才能做到这一点?

此外,上述模型关系是否要求在项目和书籍中使用has_and_belongs_to_many而不是指定连接表?

提前致谢!

编辑1: 我没有看法。这只是一个REST服务。我正在做以下事情:

def index
  @projects = Project.find(:all, :include => [:books])

  respond_to do |format|
    format.xml  { render :xml => @projects }
    format.json { render :json => @projects}
  end
end

这不会产生我正在寻找的输出(如上所述)。

2 个答案:

答案 0 :(得分:1)

您的代码完全符合您的预期。问题在于验证。

试试这个:

project = Project.find(:first)
project.books.loaded?

将返回false

project = Project.find(:first, :include => [:books])
project.books.loaded?

会返回true:)

检查对象时,通常不会显示急切加载的关联。

答案 1 :(得分:1)

事实证明以下工作:

def index
  @projects = Project.find(:all)

  respond_to do |format|
    format.json { render :json => @projects.to_json(:include => [:books]) }
  end
end

有人可以告诉我为什么这样做而以前的那个没有?