Как мне упростить мой помощник и сделать его более сухим, когда есть похожие модели? - PullRequest
0 голосов
/ 11 июля 2010

Я начинаю испытывать некоторые трудности, делая это более СУХОЙ:

http://gist.github.com/471225

Суть этого такова:

У меня есть несколько моделей: contact_email, contact_call, contact_letter и так далее.

Они существенно помогли мне создать экземпляры модели электронной почты (представленные в виде шаблона), соответствующие конкретному экземпляру / записи контакта.

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

Но это становится все сложнее. Я использовал разные способы использования 'send' и частей Ruby для идентификации ассоциированного класса, поэтому мне не нужно явно указывать его, но мне не повезло.

Таким образом - очень недовольный ... помогите!

1 Ответ

0 голосов
/ 11 июля 2010

ну вот мой первый удар по нему:

def show_contact_status(contact, method, contact_class)
  if @contact_method = contact_class.for_contact(contact, method).first
    @contact_method.formatted_status_message
  else
    "no status"
  end
end

И тогда в ваших моделях вы бы добавили именованную область:

named_scope :for_contact, lambda {|contact, method| 
  {:conditions => {:contact_id => contact.id, :email_id => method.id}}
}

, а затем formatted_status_message метод в вашей модели ContactEmail:

def formatted_status_message
  "#{self.status.to_s} (#{self.date_sent.to_s(:long)}"
end

А в других ваших моделях:

def formatted_status_message
  "sent #{self.date_sent_to_s(:long)}"
end

и вы вызываете метод для электронной почты:

show_contact_status(contact, method, ContactEmail)

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

...