【问题标题】:Ruby on Rails: Instantiate associated models with find_by_sql?Ruby on Rails:使用 find_by_sql 实例化关联模型?
【发布时间】:2011-01-23 23:39:09
【问题描述】:

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

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

有没有办法解决这个问题并使用 find_by_sql 或任何其他方法手动生成组合的包含与选择?问题是,我不知道有什么方法可以模拟 include 的功能,它在内存中实例化模型以保存包含的关联模型,这样我就可以输入 model1.associated_models 并让它不再访问数据库。

【问题讨论】:

    标签: ruby-on-rails select include find find-by-sql


    【解决方案1】:

    您是否考虑过为数据库视图创建模型?例如:

    • 使用复杂的 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 1970-01-01
      • 2013-04-23
      • 1970-01-01
      相关资源
      最近更新 更多