Как мне получить шаблон rails для добавления дополнительных атрибутов в столбцы миграции?

#ruby-on-rails #ruby

#ruby-on-rails #ruby

Вопрос:

Как мне добавить такие вещи, как значения по умолчанию, в миграции из шаблона приложения.

Например, в template.rb:

 generate(:scaffold, "Thing title:string")
  

Каков наилучший способ добавить что-то подобное , :default => 'Foo Bar', :null => false в строку миграции, которая создает столбец заголовка.

У меня есть две идеи, но я не знаю, возможно ли это.

Во-первых, можно ли добавить дополнительные атрибуты в столбец из генератора? Можно ли установить значения по умолчанию при rails g scaffold вызове команды?

Во-вторых, могу ли я добавить gsub_file строку после строки создания в моем шаблоне. Я не знаю, как сделать gsub_file в файле, где часть имени файла неизвестна (временная метка при миграции).

 Rails-3.1.0
Ruby-1.9.2-p290
  

Комментарии:

1. Может быть доступен in_root метод , который плюс немного для синтаксического анализа каталога должен дать вам местоположение файла миграции.

2. @muistoosh — сделайте это ответом, и я приму его. Вы указали мне правильный путь.

3. Конечно, я чувствовал, что должен был сказать немного больше.

4. Очень благодарен за ваш вопрос, @Preacher. Это как раз то, что мне нужно. Тем не менее, документация Thor для in_root очень скудная. Я не совсем понимаю, как мне следует использовать ответ mu. Есть какие-либо намеки на то, что вы в конечном итоге сделали?

Ответ №1:

Основываясь на информации @mu_is_to_short, я придумал неэлегантное решение, которое действительно работает. Не стесняйтесь комментировать, как его очистить. В моем шаблоне rails:

 generate "migration add_index_to_users_email"
index_migration_array = Dir['db/migrate/*_add_index_to_users_email.rb']
index_migration_file = index_migration_array.first
in_root { insert_into_file index_migration_file, 
  "n    add_index :users, :email, unique: true", after: "change" }
rake "db:migrate"
  

Документация по Thor in_root скудна. У меня есть начальные знания о Dir и т. Д. Спасибо за этот вопрос и ответ! Они были тем, что мне было нужно.

Ответ №2:

Если вы посмотрите на справку:

 $ rails generate model --help
Usage:
  rails generate model NAME [field:type field:type] [options]
[...]
  

вы не увидите никаких опций для указания чего-либо, кроме имен и типов полей. AFAIK, вам нужно отредактировать сгенерированную миграцию, если вам нужны другие параметры.

Если вы посмотрите на источник, вы увидите такие вещи:

 def generate(what, *args)
  log :generate, what
  argument = args.map {|arg| arg.to_s }.flatten.join(" ")

  in_root { run_ruby_script("script/rails generate #{what} #{argument}", :verbose => false) }
end
  

Так что, возможно, у вас есть доступ in_root (который, по-видимому, в наши дни поступает от Thor), чтобы поместить вас в корень приложения, чтобы вы могли использовать Dir['db/migrate/*'] его для поиска файла миграции; предположительно, вы знаете имя файла, за исключением начальной метки времени, и ту часть имени файла, которая, как вы знаете, уникальна, поскольку она сопоставляется с классомимя. Итак, вы должны быть в состоянии найти файл миграции, а затем вы можете исправить его по мере необходимости.

Комментарии:

1. Спасибо за этот вопрос и @mu_is_to_short за этот ответ. Это также навело меня на правильный путь, хотя мне потребовалось много времени, чтобы понять, как его неловко применять. Я помещаю свое решение в отдельный ответ, где SO позволит мне добавить некоторый код, который может помочь другим на моем уровне.