显然,在 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 创建模型?例如:
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( ... )
如果将来性能仍然是一个问题,您可以使用触发器和存储过程轻松地将数据库 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/