4

どうやら、Rails 検索クエリで include と select を同時に使用することはできず、これは wntfix として繰り返しマークされてい
ます
。 /5371

include を使用したいときと select を使用したいときがまったく同じなので、これは非常に不便だと思います。

これを回避し、find_by_sql またはその他の方法を使用して手動で include-with-select を生成する方法はありますか? 問題は、インクルードの機能をエミュレートする方法を知らないことです。インクルードされた関連モデルを保持するためにメモリ内でモデルをインスタンス化するため、model1.associated_models を入力して、データベースに再びヒットしないようにすることができます。

4

1 に答える 1

4

データベース ビューのモデルを作成することを検討しましたか? 例えば:

  • 複雑な SQL クエリを使用して、データベース ビューを作成します。

    CREATE VIEW production_plan_items AS
        SELECT * FROM [...]
        INNER JOIN [...];
    
  • このビューのモデルを作成:

    # app/view_model.rb
    class ViewModel < ActiveRecord::Base
      self.abstract_class = true
    
      def readonly?
        true
      end   
    
      def before_destroy
        raise ActiveRecord::ReadOnlyRecord
      end 
    end
    
    # app/models/logical/production_plan_item.rb
    module Logical
      class ProductionPlanItem < ::ViewModel
      end
    end
    
  • いつものように使用しますが、これらのレコードは読み取り専用であることを忘れないでください!

    Logical::ProductionPlanItem.where( ... )
    

今後もパフォーマンスが問題になる場合は、トリガーとストアド プロシージャを使用して DB ビューをマテリアライズド ビューに簡単に変換できます。これにより、アプリケーションの速度が大幅に向上し、Rails コードを 1 行も変更する必要がなくなります。

Enterprise Railsを強くお勧めします: http://www.amazon.com/Enterprise-Rails-Dan-Chak/dp/0596515200/ref=sr_1_1?ie=UTF8&qid=1293140116&sr=8-1

于 2010-12-23T21:54:40.817 に答える