Динамические методы на модели Rails - PullRequest
6 голосов
/ 30 мая 2011

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

У меня есть модель в Railsпроект.Мы назовем это дело.В соответствии с ActiveRecord и всеми этими замечательными вещами, в базе данных определены столбцы, такие как UPDATED_AT, которые становятся методами для Deal: deal.updated_at => '04 / 19/1966 3:15 am '

Скажем, я хотел вместо этого иметьметоды, которые говорили мне день недели, а не всю дату и время.Я понимаю, что есть методы ON класса DateTime, поэтому я могу сделать

  deal.updated_at.day_of_week => 'Monday' (*)

, но что, если я просто хотел

  deal.updated_day => 'Monday'

, я могу написать в deal.rb

  def update_day
    self.updated_at.day_of_week
  end

Понял.

Но что, если бы я хотел, чтобы ВСЕГДА имел метод, доступный для ЛЮБОГО столбца даты, который был добавлен в модель?

Я видел там define_method (некоторые здесь, на StackOverflow).Так что я это понимаю.Но я хотел бы назвать это сразу после того, как ActiveRecord сделал свое волшебство, верно?Поэтому, если бы в моей модели Deal были updated_at, creation_at, offer_at и lawsuit_at, я бы хотел, чтобы для каждого из них были подходящие методы.Что еще более важно, если бы другой разработчик пришел и добавил столбец с именем scammed_at, я бы хотел создать scammed_day вместе с методом scammed_at.

Как бы я это сделал?

Спасибо.

(*) Ну, или что-то в этом роде, я всегда смотрю этот вызов.

1 Ответ

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

Я думаю, что-то вроде следующего должно помочь. В вашей модели:

# looping through all model's columns
self.columns.each do |column|
  #if column's name ends with "_at"
  if column.name =~ /_at$/
    #create method like "udpated_day" 
    define_method "#{column.name[0..-4]}_day" do
      self.send(column.name).day_of_week
    end
  end
end

Но это означает, что каждый столбец имеет действительный day_of_week метод ...

Ну, вы поняли, я думаю. Не стесняйтесь спрашивать подробности

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