2

そのため、ページとアプリ、およびアプリ コンテンツのシステムをセットアップしています。ページには 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

すべてのコンテンツが個々のコンテンツの下にあり、アプリ インスタンスの下にある 1 つのオブジェクトが必要ですが、これを行う方法はありますか?

コントローラーの 1 つでこれをセットアップします。

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

@page.app_instances を正常にデバッグできますが、@page.app_instances.app_contents と言うとすぐにエラーが発生します。これは、インクルード内にインクルードがないためだと推測していますが、それをどのように書くか、またはそれが「良い習慣」であるかどうかさえわかりません

私はおそらくできることを知っています:

has_many :app_contents, :through => :app_instances

しかし、ID ではなく、コンテンツを保持するインスタンスで編成されたオブジェクトを持っています (それは理にかなっていますよね?) ... すべてのインスタンスをループして、インスタンスのコンテンツを出力できます。

私の DB アーキテクチャは理にかなっていますか? それとも私はこれを間違った方法で行っていますか

ジョエル

4

1 に答える 1

1

以下を使用してネストを含めることができます。

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

ただし、エラーが発生する主な理由は、@page.app_instances.app_contents page.app_instancesにがないためapp_contentsです。app_contentsあなたはすべてapp_instancesの結合を探しているでしょう@page

したがって、次の方法で実行できます。

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

また

page has many app_contents through app_instancesモデルで関係を定義します。

最初のケースでは、app_instancesごとにクエリを実行しますが、前述のようにインクルードを使用すると、単一のクエリになります2番目のケースでは、app_contents、app_instancesテーブルを結合する単一の結合クエリが生成されます。

于 2012-12-20T18:40:33.300 に答える