Я случиться, чтобы работать над приложением, которое также имеет Entry
модель/entries
таблицу.Вот моя миграция:
class CreateEntries < ActiveRecord::Migration
def self.up
create_table :entries do |t|
t.string :title
t.text :entry
# ...
end
end
def self.down
drop_table :entries
end
end
Очень похоже на то, что вы смотрите.
Прежде всего, первая строка, объявляющая класс CreateEntries
, который распространяется ActiveRecord::Migration
.
Далее, объявив метод класса up()
. Метод класса, в отличие от метода экземпляра, относится к классу, а не к конкретным объектам класса. Это ключевое слово «self
», которое вызывает его метод класса.
Следующая вызова create_table()
и передавая ему две вещи:
символ (":entries
"), который, как уже упоминалось выше, является как струна буквальным. Это говорит ActiveRecord, что должна быть вызвана создаваемая таблица. Допустим, вы набрали этот код вручную - забудьте о генераторах на минуту. Вы набрали «:entries
», потому что знаете, что по таблицам конвенций в приложении Rails называются множественными именами, и вы знаете, что класс модели, который подключается к этой таблице, будет называться Entry
.
Прохождение блока.
Блок может быть заключен ...
`do ... end`
или
`{ ... }`
Блок может принимать параметры, заключенные двумя "|
" с. В этом случае метод create_table
передает блоку объект класса TableDefinition
, поэтому, чтобы ответить на один из ваших вопросов, t
- это var, удерживающий этот объект. Затем внутри блока мы вызываем различные методы экземпляра TableDefinition
.
Откуда взялся объект TableDefinition
? Это происходит в методе create_table()
. Он содержит код, который создает новый объект TableDefinition
и «выходы» его блок ....
ActiveRecord исходный код ...
def create_table(table_name, options = {})
table_definition = TableDefinition.new(self)
table_definition.primary_key(options[:primary_key] || "id") unless options[:id] == false
yield table_definition
# ...
end
Не обманывайтесь, думая, что Ruby do ... end или {} блоки такие же, как {} в C/C++/Java: хотя иногда их можно использовать таким образом, они действительно работают по-разному, поскольку вы заметили. –