2015-12-02 3 views
7

Я строю двигатель рельсов, который использует внешние ключи при миграции.Условные зависимости рубиновых драгоценных камней в пределах gemspec

add_foreign_key "theblog_content_nodes", 
        "theblog_content_statuses", column: :content_status_id 

От версии 4.2 рельсам поддерживает внешние ключи сама по себе, но прежде, чем мы использовали foreigner камень для этого. Если мы попытаемся использовать foreigner с rails 4.2, и новее мы получим сообщение об ошибке.

Так как я собираюсь поддерживать рельсы, начиная с 4.0.1. Я должен использовать условную зависимость в моем gemspec.

Я нашел возможное решение here, но я понятия не имею, как проверить версию рельсов в gemspec.

# sidekiq-spy.gemspec 

if RUBY_VERSION >= '2.1' 
    spec.add_development_dependency "curses", "~> 1.0" 
end 

Примечание:

У меня есть еще одно временное решение: Я просто проверить Foreigner наличие в моих миграций. Если он недоступен, я просто не создавать внешние ключи:

if defined?(Foreigner) 
    add_foreign_key "theblog_content_nodes", 
        "theblog_content_statuses", column: :content_status_id 
end 

Но я хотел бы добавить foreigner зависимости для старых версий рельсов.

+0

Вы думаете о предоставлении двух различных версий вашего драгоценного камня для этого сценария? – iltempo

+0

@iltempo, я могу даже использовать одну версию для обоих сценариев. Просто добавьте примечание, что нам нужно добавить «gem» иностранца «' в 'Gemfile', если версия Rails меньше, чем' 4.2', и мы хотим использовать внешние ключи. –

ответ

2

Для версии рельсов доступа, мы можем использовать что-то, как показано ниже (на основе this answer):

require 'rubygems' 

rails_gem = Gem::Specification.select {|z| z.name == "rails"}.max_by {|a| a.version} 
p rails_gem.version.version 
#=> "4.2.5" 
+0

К сожалению, у нас нет доступа к 'Rails' внутри gemspec. Я только что получил следующее сообщение об ошибке: 'неинициализированные постоянные Рельсы из /Users/kont/projects/theblog/theblog.gemspec:21:in«блока в

»' –

+0

Обновленный ответ использовать 'rubygems' API. Пожалуйста, проверьте, будет ли это работать для вас. –

+0

Я пробовал это как в самом двигателе, так и в приложении, используя этот движок. Кажется, он работает правильно. Благодаря! –