Миграция на Rails 3: логическое значение (mysql vs postgreSQL) - PullRequest
5 голосов
/ 24 мая 2011

Я пытаюсь добавить «липкую» опцию в темы моего форума.Вот так выглядит моя миграция

  def self.up
    add_column :topics, :sticky, :boolean, :null => false, :default => false
  end

  def self.down
    remove_column :topics, :sticky
  end

Это прекрасно работает локально на mysql, но когда я помещаю изменения в heroku (который использует PostgreSQL), это то, что я получаю при использовании консоли

>> t.sticky
=> "f"
>> t.sticky.class
=> String
>> t.sticky = true
=> true
>> t.sticky.class
=> TrueClass

Почему значение этого свойства по умолчанию является строкой?

Редактировать: И если я сохраняю объект, он не меняет свойство закрепления, то есть оно по-прежнему равно "f".

Ответы [ 3 ]

4 голосов
/ 24 мая 2011

В psql логические значения отображаются как t или f. В зависимости от драйвера БД они преобразуются в логические значения или остаются в своем строковом представлении.

Драйвер PDO в PHP делает то же самое. (Во всяком случае, раньше ... Я смутно припоминаю, что в последней версии его уже нет.)

3 голосов
/ 24 мая 2011

Если вы не найдете ошибку в RoR или драйвере базы данных, как предлагает Денис, вы можете определить (переопределить) средство чтения как:

def sticky
  ! [false, nil, 'f'].include?( self[:sticky] )
end

Это преобразует известные значения 'false' в настоящие логические значения ruby.

Я помню, что было как минимум два гема для подключения к базам данных PostgreSQL. Может быть, вы можете использовать другой?

А вы уверены, что столбец в базе данных не определен как String? Я знаю, что в вашей миграции это логическое значение, но, может быть, что-то где-то пошло не так?

1 голос
/ 26 мая 2011

Я не уверен, в чем проблема, но я просто откатил миграцию и запустил ее снова, и на этот раз она сработала. Просто поместите это здесь на случай, если кто-то еще столкнется с подобной проблемой.

Спасибо за вашу помощь, ребята.

...