Переопределить приведение типа для поиска ActiveRecord - PullRequest
1 голос
/ 04 февраля 2010

Я бы хотел переопределить приведение типов, которое ActiveRecord делает с моими полями даты и времени, при использовании искателя, такого как .first или .all, но, похоже, он работает не так, как я думал ... Я ожидал переопределить, чтобы вернуть datetime_before_type_cast, как это работает, когда я получаю доступ к полю непосредственно в нижнем примере.

В моей модели есть то, что, как я думал, переопределит атрибут:

def datetime
  self.datetime_before_type_cast
end

SomeModel.first
#<SomeModel datetime: "2010-01-20 12:00:00"> #shouldn't it be "2010-01-20 12:00:00.123"?

SomeModel.first.datetime 
"2010-01-20 12:00:00.123"

Ответы [ 2 ]

0 голосов
/ 16 августа 2017

Ниже предполагается, что Rails 3.x.

Помните, что

>> SomeModel.first
=> #<SomeModel datetime: "2010-01-20 12:00:00"> #shouldn't it be "2010-01-20 12:00:00.123"?

и

>> SomeModel.first.datetime
=> "2010-01-20 12:00:00.123"

будут показывать различный вывод в консоли Rails, потому что консоль вызовет #inspect в результате выполнения оператора.

>> SomeModel.first

фактически отобразит

>> SomeModel.first.inspect

, который внутренне вызывает #attribute_for_inspect (name) (в отличие от вызова переопределенного метода #datetime), тогда как

>> SomeModel.first.datetime 

вызовет переопределенный метод #datetime, в результате чего для него будет вызван #inspect.

Также убедитесь, что вы работаете с Ruby DateTime, а не с Time, Date или другой датой./ time class, если вы хотите переопределить методы #inspect или #to_s для изменения текстового формата вашего поля 'datetime'.

0 голосов
/ 05 февраля 2010

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

Кроме того, я должен добавить, что данные отображаются на моем контроллере в формате xml, так что, похоже, это хорошо подходит для этого.

def datetime
  self.datetime_before_type_cast # => 2010-01-20 12:00:00.123
end

#override to_xml, excluding the datetime field and replacing with the method of the same name
def to_xml(options = {})
  super(:methods => [:datetime], :except => :datetime)
end

SomeModel.first.to_xml

<?xml version="1.0" encoding="UTF-8"?>
...
<datetime>2010-01-20 12:00:00.123</datetime>
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...