ruby-on-rails - Ruby on Rails : Instantiate associated models with find_by_sql?

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

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

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

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

最佳答案

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

  • 使用复杂的 SQL 查询创建数据库 View :
    CREATE VIEW production_plan_items AS
        SELECT * FROM [...]
        INNER JOIN [...];
    
  • 为此 View 创建模型:
    # 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( ... )
    

  • 如果将来性能仍然是一个问题,您可以使用触发器和存储过程轻松地将数据库 View 转换为物化 View 。这将为您的应用程序带来巨大的速度提升,而且您甚至不必更改一行 Rails 代码。

    企业 Rails 强烈推荐阅读:
    http://www.amazon.com/Enterprise-Rails-Dan-Chak/dp/0596515200/ref=sr_1_1?ie=UTF8&qid=1293140116&sr=8-1

    关于ruby-on-rails - Ruby on Rails : Instantiate associated models with find_by_sql?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2384616/

    相关文章:

    ruby-on-rails - 添加数据库字段迁移失败 'method not found'

    css - 简单形式的 Rails - 样式

    ruby-on-rails - 在迁移期间使用模型方法填充列

    c# - 如何解析 XSL 包含在从字符串加载 XSL 的转换中?

    loops - Coldfusion 用包含分割循环

    ruby-on-rails - Ruby Geocoder [Rails] - 如何遍历这个结果

    mysql - 在任何 1 小时的时间间隔内选择计数 > 1 的数据

    jquery - 条件选择和正常选择

    MySQL 选择需要很长时间

    c - 错误 : linker command failed with exit code 1