Обновите Rails 3 до 5, синтаксис блока контекста - PullRequest
0 голосов
/ 01 октября 2018

Я обновляю приложение с 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?любая помощь будет оценена, спасибо!

1 Ответ

0 голосов
/ 01 октября 2018

Отличный вопрос!

Вы можете решить эту загадку, заменив свое отношение следующим условным выражением:

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 загружена, и создаетотношения с использованием подходящего синтаксиса.

(я могу ошибаться, но, насколько я помню, в версии 4.0.0. был введен новый синтаксис has_many)

...