4

显然,在 Rails 查找查询中不能同时使用 include 和 select,这已被反复标记为 wontfix: http : //dev.rubyonrails.org/ticket/7147
http://dev.rubyonrails.org/ticket
/5371

这让我觉得非常不方便,因为我想要使用 include 的时间与我想要使用 select 的时间完全相同——当每一点性能都很重要时。

有没有办法解决这个问题并使用 find_by_sql 或任何其他方法手动生成组合的包含与选择?问题是,我不知道有什么方法可以模拟包含的功能,它在内存中实例化模型以保存包含的关联模型,这样我就可以输入 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 代码。

强烈推荐阅读 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 回答