ActiveRecord:Has_many在另一个has_many里面 - 使用rails3

时间:2012-12-20 18:28:25

标签: ruby-on-rails ruby-on-rails-3 activerecord has-many

所以我正在建立一个页面和应用程序系统以及应用程序内容。页面has_many:app_instances和app_instances has_many:app_contents。

我有模特: 页面,应用,app_instance,app_content

在我的模特中:

class Page < ActiveRecord::Base
  has_many :app_instances
end

class App < ActiveRecord::Base
  belongs_to :page
end

class AppInstance < ActiveRecord::Base
  belongs_to :page
  belongs_to :app
  has_many :app_contents
end

class AppContent < ActiveRecord::Base
  belongs_to :app_instance
  belongs_to :app
end

我希望有一个对象,其中所有内容都位于应用实例下的各个内容下...但有没有办法做到这一点?

我在我的一个控制器中设置了这个:

@page = Page.includes(:app_instances).find(params[:id])

我可以成功调试@ page.app_instances,但很快我说@ page.app_instances.app_contents我收到错误。我猜这只是因为我错过了include中的include,但不确定我是怎么写的,或者即使那是“好习惯”

我知道我可能会这样做:

has_many :app_contents, :through => :app_instances

但是id更倾向于用保存内容的实例组织对象(这是有意义的,对吗?)...所以我可以循环遍历所有实例,并打印出实例的内容

我的数据库架构是否有意义?或者我是以错误的方式行事

乔尔

1 个答案:

答案 0 :(得分:1)

您可以使用以下内容包含嵌套:

Page.includes(:app_instances=>[:app_contents])

但是您收到错误的主要原因是,@page.app_instances.app_contents page.app_instances没有任何app_contents。您将寻找所有app_contents app_instances <{1}} @page的联合

所以可以通过以下方式完成:

@page.app_instances.app_contents.each{|ai| (list || =[]) << ai.app_contents}
list.flatten!

OR

在模型中定义page has many app_contents through app_instances关系。

第一种情况会运行每个 app_instances的查询,但是如前所述使用 includes 会导致单个查询。第二种情况会导致单个连接查询加入app_contents,app_instances表