所以我正在建立一个页面和应用程序系统以及应用程序内容。页面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更倾向于用保存内容的实例组织对象(这是有意义的,对吗?)...所以我可以循环遍历所有实例,并打印出实例的内容
我的数据库架构是否有意义?或者我是以错误的方式行事
乔尔
答案 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表