升级 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
版本中引入的。)
我正在将一个应用程序从 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
版本中引入的。)