rails / ActiveRecord: как я могу указать другой класс для определенного атрибута? - PullRequest
1 голос
/ 03 марта 2011

В рельсах 3 у меня есть модель базы данных с полем birthday типа date. По разным причинам (например, дата без известного года), я бы хотел, чтобы это был класс, отличный от Date, и / или что-то смешанное с классом Date для созданных только объектов. из этого атрибута . Какой лучший способ сделать это?

Например, предположим, я хочу сделать что-то вроде:

class BirthDate < Date
  def to_s
    case year
    when 1 # if I store a date with a null year, it sets it to 1
      strftime("%m/%d")
    else
      super
    end
  end
end

Этот класс дает мне поведение, которое я хочу (на данный момент; вполне возможно, что я изменю его в будущем), и я могу заставить свою модель дать мне доступ к этому, используя что-то вроде:

class Person < ActiveRecord::Base
  def bday
    BirthDate.new(birthday.year, birthday.month, birthday.day)
  end
end

А потом просто измените мои взгляды, чтобы использовать bday вместо дня рождения. Хотя это кажется расточительным (необходимость создания нового объекта из уже созданного - не берите в голову, что Date, похоже, не имеет типа «конструктор копирования»? (Или я просто где-то пропускаю его?)

В любом случае, я думаю, что, возможно, ActiveRecord может предоставить что-то похожее на:

class Person < ActiveRecord::Base
  class_for :birthday => BirthDate
end

Есть что-нибудь подобное? Я провел несколько поисков в Google, просмотрел несколько документов и не нашел его. Но так как я не знаю, как это можно назвать,

(Возможно, пришло время начать копаться в источнике - я слышал, что это хороший способ узнать больше о платформе. С другой стороны, некоторые говорят иначе ;))

1 Ответ

1 голос
/ 03 марта 2011

Вы можете переопределить метод получения атрибута вручную:

def birthday
  BirthDate.parse(birthday_before_type_cast)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...