Ruby DataMapper не сохраняет свойство, установленное перед хуком - PullRequest
2 голосов
/ 29 марта 2011
class Order
  include Datamapper::Resource

  property :birthday_day, String  
  property :birthday_month, String
  property :birthday_year, String
  property :birthday, Date

  before :save do
    @birthday = Date.new(@birthday_year.to_i, @birthday_month.to_i, @birthday_day.to_i)
  end
end

Это часть модели, но это просто. При сохранении поля (из irb или из приложения sinatra): день рождения не сохраняется в БД. Но в irb я вижу объект, где: день рождения существует и его формат даты. При изменении поля руководства (от irb): f.birthday = Date.new f.save В объекте и в БД результат появляется (в obj как Date obj, в DB как "2010-2-3")

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

Извините за не очень хороший английский.

Ответы [ 2 ]

4 голосов
/ 29 марта 2011

Вы должны использовать метод мутатора свойства.Установка ивара не запускает грязное отслеживание.Просто сделайте это:

self.birthday = Date.new(birthday_year.to_i, birthday_month.to_i, birthday_day.to_i)

Также было бы лучше использовать Integer в качестве типа свойства для года, месяца и дня.

3 голосов
/ 29 марта 2011

Документация DataMapper рекомендует # attribute_set

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

В вашем случае:

before :save do
  set_attribute(:birthday => Date.new(self.birthday_year.to_i, self.birthday_month.to_i, self.birthday_day.to_i))
end

Для чего бы это ни стоило, если бы мне не понадобилось использовать все поля в критериях SELECT, я бы сохранил либо целые поля, либо дату, но не оба:

class Order
  include Datamapper::Resource

  property :birthday, Date
end

# change month
o = Order.create(:birthday => Date.new(...))
o.update(:birthday => Date.new(o.birthday.year, new_month, o.birthday.mday))

Или

class Order
  include Datamapper::Resource

  property :birthday_day, String  
  property :birthday_month, String
  property :birthday_year, String

  def birthday
    if self.birthday_day && self.birthday_month && self.birthday_year
      Date.new(self.birthday_day, ...)
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...