Как переопределить столбец в модели Rails? - PullRequest
14 голосов
/ 06 мая 2011

У меня есть модель для одной из моих таблиц базы данных.Я хочу переопределить имя столбца для этой конкретной таблицы.Как бы я этого достиг.

Например, пусть моя таблица будет называться DUMMY, и в ней будет один столбец с именем col_a

col_a
20
34
42
23
12

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

Ответы [ 4 ]

30 голосов
/ 06 мая 2011

Вы можете переопределить метод col_a.Используйте метод read_attribute, чтобы прочитать значение в базе данных.Как то так:

def col_a
  if self.read_attribute(:col_a).to_s.end_with?('0')
    0
  else
    self.read_attribute(:col_a)
  end
end
9 голосов
/ 06 мая 2011

Вы можете просто определить метод с тем же именем, что и столбец. Чтобы получить фактическое значение столбца, используйте self [column_name]. Так что-то вроде этого должно работать:

class Dummy < ActiveModel::Base
  def col_a
    self[:col_a] % 10 == 0 ? 0 : self[:col_a]
  end
end

(Предполагается, что col_a является целым числом.)

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

Этого можно добиться, перезаписав методы доступа по умолчанию , как описано в документации.Все значения столбцов автоматически доступны через базовые методы доступа к объекту Active Record, но иногда вы хотите специализировать это поведение.Это можно сделать, переписав методы доступа по умолчанию (используя то же имя, что и у атрибута) и вызвав read_attribute(attr_name) и write_attribute(attr_name, value), чтобы фактически изменить ситуацию.

Для получения дополнительной информации перейдите к разделу Перезапись доступных по умолчанию .

0 голосов
/ 09 марта 2018

Я немного опоздал на вечеринку, но действительно элегантный способ сделать это - просто использовать super

class Dummy < ApplicationRecord
  def col_a
    super % 10 === 0 ? 0 : super
  end
end
...