В Rails 2.x как мне обработать таблицу с «допустимым» столбцом? - PullRequest
0 голосов
/ 20 августа 2009

У меня есть таблица, которая включает столбец с именем «действительный». Это вызвало проблему после обновления до Rails 2. ActiveRecord ожидает "def valid?" чтобы выполнить проверку, не возвращайте логическое значение из базы данных.

Как мне обойти эту проблему? Является ли переименование столбца моим единственным вариантом?

Ответы [ 4 ]

2 голосов
/ 21 августа 2009

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

Если ваша база данных не открыта для других приложений, то есть - иначе вы просто пострадаете в какой-то степени от того, что вы делаете ...

Зачем переименовывать? Одним из величайших преимуществ, которые мы получаем от Rails, является соглашение по конфигурации. «Волшебство», если хотите. (Некоторые говорят, что это на самом деле плохо, но иди со мной в этом). Если вы сохраняете столбец с именем «действительный», то вы делаете свои модели непоследовательными: эта должна работать не так, как другие, и это плохо. Или, возможно, вы можете сделать обезьяньё исправление ActiveRecord :: Base, чтобы все ваши модели работали одинаково, но ваше приложение больше не следует соглашению.

Из личного опыта: я создал столбец с именем "user_id", который ActiveRecord, по соглашению, рассматривал как внешний ключ (как и все, что заканчивается на "_id"). Я закодировал это, что я теперь считаю ошибкой. Еще один пункт в списке дел ...

Это не обязательно неправильно идти против соглашений Rails: есть много мест, где вы можете это сделать, и они хорошо документированы. Что касается ActiveRecord, многие из них специально разработаны, чтобы уменьшить сложность подключения, например, к устаревшим схемам баз данных. Внимательно посмотрите на плюсы и минусы, как вы, очевидно, делаете, и взвесьте ваши варианты.

1 голос
/ 20 августа 2009

Я могу предотвратить сбой, добавив в свою модель следующее, но это не совсем удовлетворительно:

class << self
  def instance_method_already_implemented?(method_name)
    return true if method_name == 'valid?'
    super
  end
end
0 голосов
/ 20 августа 2009

Вы можете получить доступ к атрибуту через нотацию []:

row[:valid] = "foo"

Вы получите DangerousAttributeError, если попытаетесь инициализировать объект следующим образом:

row = MyModel.new :valid => "foo"

Чтобы предотвратитьчто вы можете определить атрибут setter для valid, например так:

def valid=(x)
  self[:valid] = x
end

The valid?Метод все еще будет для проверки строки.Вы можете определить другой метод вопроса, например, val?чтобы получить логическое значение, например:

def val?
  query_attribute('valid')
end

Теперь вы можете использовать row.val? для тестирования логического значения

0 голосов
/ 20 августа 2009

Вам нужно увидеть колонку в вашей модели? Если нет, переопределение ActiveRecord :: Base.columns сделает свое дело ...

def self.columns
  super.delete_if {|c| c.name == 'valid' }
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...