Пользовательские именованные атрибуты в Rails - PullRequest
1 голос
/ 26 июня 2009

Возможно ли в ActiveRecord настроить / переопределить имя атрибута, чтобы оно не совпадало с именем столбца в базе данных?

Мой конкретный случай включает в себя устаревший столбец "revision", который я не могу удалить в настоящее время. Имя столбца конфликтует с acts_as_audited. Что, конечно, приводит к ошибкам устаревшего кода, который мне нужен, пока мои миграции не будут завершены.

Мое желаемое решение - переопределить имя атрибута для этого столбца и обновить несколько областей, которые его вызывают. Таким образом, позволяя устаревшему столбцу жить рядом с act_as_audited.

Ответы [ 2 ]

3 голосов
/ 26 июня 2009

Я не использовал acts_as_audited, но я предполагаю, что его реализация переопределяет метод доступа для этого столбца. В этом случае вы должны просто сделать что-то вроде этого:

class ActiveRecord::Base
  def self.name_column(column_name, new_name)
    define_method(new_name) {read_attribute column_name}
    define_method("#{new_name}=") {|value| write_attribute column_name, value}
    define_method("#{new_name}?") {attribute_present? column_name}
  end
end

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

О, ответ метапрограммирования, уничтожающий дублирование:

class ActiveRecord::Base
  def self.name_column(column_name, new_name)
    { ''  => :read_attribute, 
      '=' => :write_attribute, 
      '?' => :attribute_present? }.each do |suffix,method|
      define_method("#{new_name}#{suffix}") {|*args| send method, column_name, *args}
    end
  end
end

Просто потому, что мне нравится показывать, как это можно сделать.

0 голосов
/ 26 июня 2009

Создайте миграцию, чтобы переименовать столбец из ревизии в любую нужную вам. Затем вы можете объявить attr_accessor: revision и использовать его без необходимости привязывать атрибут к полю базы данных.

...