升级 Rails 3 到 5,范围块语法

Upgrade Rails 3 to 5, scope block syntax

我正在将一个应用程序从 Rails 3.2 升级到 5.2,我需要同时拥有两个版本 运行ning 并且 运行 遇到范围问题块语法。

我在项目模型上得到了这种关系

has_many   :companies_projects, include: :company_type, order: 'company_types.order_id'

在 Rails 5

中给出了这个错误
Unknown key: :include. Valid keys are: :class_name, :anonymous_class, :foreign_key etc...

我可以通过将语法更改为以下内容来解决此问题:

has_many   :companies_projects, ->{ includes( :company_type ).order('company_types.order_id') }

但在 rails 3 应用程序中它会导致此错误:

wrong number of arguments (1 for 0)

这个范围块是否可以在 rails 3 和 5 中工作?任何帮助都会得到帮助,谢谢!

好问题!

你可以通过用这个条件表达式替换你的关系来解决这个难题:

if Gem::Requirement.new('>= 4.0.0').satisfied_by?(Gem.loaded_specs['activerecord'].version)
  has_many :companies_projects, ->{ includes(:company_type).order('company_types.order_id') }
else
  has_many :companies_projects, include: :company_type, order: 'company_types.order_id'
end

它检查加载了 activerecord gem 的哪个版本,并使用合适的语法创建关系。

(我可能是错的,但我记得 has_many 的新语法是在 4.0.0 版本中引入的。)