2010-11-09 3 views
2

КомандаЧто означает этот Ruby-код?

rails generate scaffold Post name:string title:string content:text 

генерируется следующий файл: 20101109001203_create_posts.rb

class CreatePosts < ActiveRecord::Migration 
    def self.up 
    create_table :posts do |t| 
     t.string :name 
     t.string :title 
     t.text :content 

     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :posts 
    end 
end 

Поскольку я новичок в Ruby (только для чтения one book), у меня есть несколько вопросов по этому блоку кода:

  1. Что делает self. означает в self.up и self.down? Как это отличается от простого up и down?

  2. Что все эти двоеточия (:) означает в :posts, :name и т. Д.? Это просто часть имени переменной?

  3. Что означает t.string :name? Это вызов функции string на объекте t с параметром :name?

Большое спасибо!

ответ

3
  1. Если вы определяете метод с использованием def foo, вы создаете метод экземпляра под названием foo. То есть если у вас есть экземпляр класса CreatePosts, вы можете сделать the_instance.foo. Однако, делая def self.foo (или, альтернативно, def CreatePosts.foo, что делает то же самое, потому что self == CreatePosts в class ... end -block), вы определяете метод singleton, который доступен только на CreatePosts. То есть он называется CreatePosts.foo не the_instance.foo (это несколько похоже на статические методы на других языках, но не совсем потому, что вы можете использовать один и тот же синтаксис для определения одноэлементных методов для объектов, которые не являются классами).

  2. :name не имеет никакого отношения к какой-либо переменной под названием name. Это символьный литерал, который похож на интернированную неизменяемую строку (хотя класс Symbol не определяет какие-либо методы для манипуляции с строкой). Вы можете думать о символах как о каких-то мини-строках, которые используются, когда вам просто нужно наклеить что-то и не нужно выполнять строковые манипуляции.

  3. Да, точно.

+0

Большое спасибо! 1,3 - Понятно. Что касается 2: Это какой-то знак «goto»? Где находится код, который определен под этими метками? Это правда, что эти метки должны начинаться с двоеточия? Не могли бы вы указать мне на рубинский учебник по этой теме? Еще раз спасибо!! –

+0

@ Миша: Нет, ничего подобного. Как я уже сказал, они похожи на струны голых костей. И да, им нужно начинать с двоеточия. – sepp2k

+0

ОК, я думаю, что понял. ': name' точно так же, как строка' 'name" ', но без каких-либо строковых функций. Благодаря ! –

1
  1. self является файл миграции и up и down применяются и обратной миграции соответственно.
  2. двоеточий символы и обозначают имена, типа, масштаб и т.д .. и они обозначают по типу колонок/порядка
  3. t.sting :name средства создания столбца на текущем объекте миграции с именем name и типом string
+3

'self' не файл. 'self' - это класс' CreatePosts'. – sepp2k

1
  1. def self.up определяет метод класса вверх. Когда rails запускает эту миграцию, он вызывает CreatePosts.up.Альтернативный вариант, который будет определять метод экземпляра, который можно было бы вызвать с помощью CreatePosts.new.up.

  2. : имя (например) является примером символа. Поскольку символ похож на строку, но разделяется до точки, где почти ничего нет, кроме текста. В этом случае они просто используют его, чтобы сообщить методу #string, что вы хотите вызвать столбец.

  3. У вас это точно.

Это может оказаться полезным.

http://railsapi.com/doc/rails-v3.0.0/classes/ActiveRecord/ConnectionAdapters/TableDefinition.html#M000666

+0

Спасибо за ваш ответ! Однако ссылка не работает. –

+0

Ooops, похоже, он обновил свои документы до 3.0.1. Это работает прямо сейчас. :) http://railsapi.com/doc/rails-v3.0.1/classes/ActiveRecord/ConnectionAdapters/TableDefinition.html#M000666 –