1

私はまだプロジェクトを開発していて、自分のかゆみを掻くために使用例を学習しているので、おそらく2つのステップでリファクタリングする必要があります。私は3つのモデルを持っています:手紙、電話、電子メール。それらにはいくつかの類似点がありますが、説明からわかるように、いくつかの異なる属性もあると思います。

理想的には、Letters、Calls、Emailsのタイプで、イベントとしてリファクタリングできますが、サブクラスを拡張する方法がわかりませんでした。

私の当面の必要性はこれです:私は電子メール(例えば)が特定の連絡先に送信されたかどうかのステータスをチェックするヘルパーを持っています:

def show_email_status(contact, email)

  @contact_email = ContactEmail.find(:first,
     :conditions => {:contact_id => contact.id, :email_id => email.id })
  if ! @contact_email.nil?
    return @contact_email.status
  end
end

もちろん、連絡先にも電話がかかってきたかどうかの状況を知りたいと思ったので、次のように書きました。

def show_call_status(contact, call)

  @contact_call = ContactCall.find(:first, 
     :conditions => {:contact_id => contact.id, :call_id => call.id })
  if ! @contact_call.nil?
    return @contact_call.status
  end
end

show_status(contact、call)またはshow_status(contact、email)と言うことができる単一のヘルパーshow_statusを作成できるようにしたいと思います。これにより、オブジェクト@contact_callまたは@contact_emailのどちらを検索するかがわかります。

はい、@ contact_eventだけの方が簡単ですが、プログラムを起動して実行している間に小さなリファクタリングを実行したいので、特定の連絡先の履歴を作成する機能がはるかに簡単になります。

ありがとう!

注:現在、contact_email、contact_callなどの属性としてステータスがあります。Contact_emailはメールが送信されたときにのみ作成されるため、メールが送信されていない場合はcontact_emailは作成されません。また、ステータスが「」であることを知る必要があります。未送信」..。

4

3 に答える 3

1

例から、関連付けが次のようになっていると仮定します。

class Contact
    has_many :emails, :through => :contact_emails
    has_many :calls, :through => :contact_calls
end

status は ContactEmail / ContactCall の属性ですが、Email / Call オブジェクトのステータスが必要な場合 (Kandada answer here に基づく):

class Contact 
  def event_status(event)
    event_type = event.class.name
    foreign_key = ("%s_id" % event_type.downcase).to_sym

    assoc = "Contact#{event_type}".tableize
    contact_event = send(:assoc).first(:conditions => {foreign_key => event.id})
    contact_event.try(:status) 
  end
end
于 2010-05-02T13:25:43.700 に答える
0

すでに show_call_status と show_email_status があるので、3 つ目の show_letter_status を記述できます。

次に、これを使用します。

def show_status(contact, call_or_email_or_letter)
  model_name = call_or_email_or_letter.class.name.tableize.singularize
  send "show_#{model_name}_status", contact, call_or_email_or_letter
end
于 2010-05-01T19:08:42.050 に答える
0

ヘルパーをContactモデルに移動できます。

class Contact < ActiveRecord::Base

  has_many :contact_emails
  has_many :contact_calls
  has_many :contact_letters

  def event_status event
    assoc_name = "Contact#{event.class.name}".pluralize.underscore
    foreign_key = "%s_id" % event.class.name.underscore
    ce = send(assoc_name).first(:conditions => {foreign_key => event.id})
    ce ? ce.status : nil
  end

end

これで、次のようにステータスを取得できます。

contact.event_status(email1)
contact.event_status(letter2)
contact.event_status(call12)

これにより、さまざまなヘルパーの必要性が軽減されます。さまざまなイベントに対処する 1 つの方法。

于 2010-05-02T01:51:39.313 に答える