Значение | t |в Ruby's create_table - PullRequest
0 голосов
/ 07 июня 2018

Что означает |t| в следующем блоке кода Ruby?

create_table :products do |t|
  t.string :name
end

Ответы [ 3 ]

0 голосов
/ 07 июня 2018

Rails действительно более сложный, чем этот, но, возможно, это может дать представление:

def create_table(table)
  p table
  p yield table
end

create_table 'products' do |t|
  t.insert t.size, '_table'
end

#=> "products"
#=> "products_table"

Чтобы сократить его, я использовал класс String, вызывающий метод insert для 'products'.Но если вы хотите углубиться в источник рельсов: create_table

t.class #=> String в этом примере.

t.class #=> ActiveRecord::ConnectionAdapters::SQLite3::TableDefinition в Rails с базой данных SQLite3.

0 голосов
/ 07 июня 2018

Вы можете думать, что это похоже на написание вашей миграции следующим образом:

t = TableCreator.new
t.table_name = 'products'
t.string 'name'
t.save

Метод create_table был определен примерно так в миграторе Rails:

def create_table(name)
  creator = TableCreator.new(db_connection: current_connection)
  creator.table_name = name
  yield creator # this is the line that creates the |t| in your question
  t.save
end

Это позволяет вашей миграции выглядеть так:

create_table :products do |t|
  t.string :name
end

Что гораздо приятнее и проще для вас писать, так как вам не нужно, например, вызывать .save самостоятельно.

Называть это t полностью зависит от вас, это просто местное имя.С таким же успехом вы могли бы написать:

create_table :products do |table|
  table.string :name
end

Мнение: Это очень простой "Hello World!"уровня Ruby, и вы, возможно, захотите изучить некоторые основы языка, прежде чем углубляться во что-то такое сложное, как Rails.

0 голосов
/ 07 июня 2018

Google для ruby block yield.

Внутри create_table кто-то создал t = TableDef.new или аналогичный, а затем вызвал yield(t).Это передает объект в блок для использования строками внутри блока.

...