#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 позволит мне добавить некоторый код, который может помочь другим на моем уровне.