1

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

我在项目模型上有这种关系

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)

有没有一个快乐的媒介,这个范围块可以在轨道 3 和 5 中工作?任何帮助将不胜感激,谢谢!

4

1 回答 1

2

好问题!

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

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。)

于 2018-10-01T19:13:19.543 回答