#ruby-on-rails #database #model
Вопрос:
У меня нет настроенной среды Rails, и на самом деле довольно сложно найти быстрый ответ на этот вопрос, поэтому я спрошу экспертов.
Когда Rails создает таблицу на основе вашей «модели», которую вы настроили, создает ли Rails таблицу, которая точно отражает эту модель, или она добавляет в таблицу дополнительные поля, чтобы помочь ей творить свое волшебство? Если да, то какие еще поля он добавляет и почему? Возможно, вы могли бы вырезать и вставить структуру таблицы или просто указать мне раздел документа или учебника, посвященный этому.
Ответ №1:
Если вы создаете совершенно новое приложение, включая новую базу данных, то вы можете создать всю серверную часть с помощью миграции. Выполняется
ruby script/generate model User name:string
создает как файл user.rb для модели, так и миграцию:
class CreateUsers < ActiveRecord::Migration
def self.up
create_table :users do |t|
t.string :name
t.timestamps
end
end
def self.down
drop_table :users
end
end
Вы можете видеть, что по умолчанию сценарий создания добавляет «метки времени» для (созданных и последних обновленных), и они управляются автоматически, если им разрешено присутствовать.
Не видно, но важно, что дополнительный столбец «идентификатор» создается в качестве единственного первичного ключа. Однако это не является сложным — вы можете указать свой собственный первичный ключ в модели, что полезно, если вы работаете с устаревшей схемой. Предполагая, что вы сохраняете идентификатор в качестве ключа, Rails будет использовать любые функции, специфичные для СУБД, доступные для новых значений ключей.
Ответ №2:
В ActiveRecord модели создаются из таблиц базы данных, а не наоборот.
Возможно, вы также захотите изучить миграции, которые являются способом описания и создания базы данных на основе кода Ruby. Однако миграция не связана с моделью; модель по-прежнему создается во время выполнения на основе формы базы данных.
На сайте Rails есть скринкасты, связанные с активными записями и миграциями: http://www.rubyonrails.org/screencasts
Комментарии:
1. Это странно, потому что видео, которое я видел, в котором какой-то парень демонстрировал потрясающую красоту Rails, внес изменения в модель и распространил эти изменения в базу данных. Или я что-то не так помню?
2. Я когда-либо использовал только ActiveRecord. Возможно, то, что вы видели, было другой системой доступа к данным.
3. Иксион, вы, вероятно, думаете о знаменитом видео «Блог за 15 минут», в котором использовались миграции для внесения изменений в схему базы данных, которые были немедленно отражены в формах на экране из-за использования строительных лесов.
4. DataMapper («конкурент» ActiveRecord) использует подход, основанный на непосредственном описании таблицы в файле модели. Однако DM используется больше с Merb, чем с Rails. Может быть, вы видели скринкаст Merb/DM?
Ответ №3:
Вот официальная документация для ActiveRecord. Это согласуется с Брэдом. Возможно, вы видели либо другой метод доступа, либо миграцию (которая изменяет таблицы и, следовательно, модель).
Ответ №4:
У меня был небольшой опыт переноса устаревших баз данных в Rails и доступа к базам данных Rails из внешних сценариев. Это похоже на то, что ты пытаешься сделать. Мой опыт работы с базами данных Rails, построенными поверх MySQL, поэтому ваш пробег может отличаться.
Одно скрытое поле является наиболее очевидным-поле «идентификатор» (целое число), которое Rails использует в качестве первичного ключа по умолчанию. Если вы не укажете иное, каждая модель в Rails имеет поле «идентификатор», которое является уникальным целочисленным первичным ключом с приращением. Это поле «идентификатор» будет автоматически отображаться в любой модели, созданной в Rails в ходе миграции, если вы не скажете Rails не делать этого (указав другое поле в качестве первичного ключа). Если вы работаете с базами данных Rails из-за пределов самих Rails, вам следует быть осторожным с этим значением.
Поле «идентификатор» является ключевой частью магии Rails, поскольку оно используется для определения ассоциаций Rails. Допустим, вы связываете две таблицы вместе-Группу и Человека. Модель группы будет иметь поле «идентификатор», а модель человека должна иметь как собственное поле «идентификатор», так и поле «group_id» для отношений. Значение в «group_id» будет ссылаться на уникальный идентификатор связанной группы. Если вы построили свои модели таким образом, чтобы следовать этим соглашениям Rails, вы можете воспользоваться ассоциациями Rails, сказав, что модель группы «has_many :люди» и что модель человека «принадлежит к группе».
Миграции Rails также по умолчанию хотят добавить поля «created_at» и «updated_at» (так называемые «метки времени»), которые являются полями даты и времени. По умолчанию они используют преимущества «магии» в базе данных — не в самих Rails — для автоматического обновления при создании или изменении записи. Я не думаю, что эти столбцы приведут вас в замешательство, потому что о них следует позаботиться на уровне базы данных, а не с помощью какой-либо специальной магии рельсов.
Комментарии:
1. Поля created_at и updated_at обрабатываются в Rails, а не с помощью какой-либо «магии»базы данных. Вы можете увидеть это непосредственно в сгенерированном SQL.