0

私はいくつかの同様のモデルContactEmail、ContactLetterなどを持っています。

それぞれbelongs_toが連絡先

それぞれbelongs_toが会社に連絡する

それで、私がしたことは、ContactEmailの仮想属性を作成することでした。

  def company_name
    contact = Contact.find_by_id(self.contact_id)

    return contact.company_name

  end

質問:ContactEmailsオブジェクトのセットがある場合(たとえば、find(:all)メソッドから)、すべてのcompany_nameの簡単なリスト(重複なし)を取得するにはどうすればよいですか?

たとえば、統計gemを使用してContactEmail.company_nameを検索しようとすると、company_nameがContactEmailの列ではないというエラーが表示されます。

4

1 に答える 1

0

ContactEmailあなたのセットが@contact_emails (テストされていない)にあると仮定します:

@contact_emails.collect { |contact_email| contact_email.company_name }.uniq

ただし、この目的のために仮想属性は必要ありません。ActiveRecordは外部キーに基づいて関係を自動的に設定するためcompany_name、ContactEmailモデルからメソッドを取り出して次のようにすることができます。

@contact_emails.collect { |contact_email| contact_email.contact.company_name }.uniq

大規模なセットではパフォーマンスが考慮される可能性があるため、それが問題になる場合は、より高度なSQLクエリを使用する必要があります。

2番目の質問に答えるために編集する

が列の場合company_name、次のことができます。

ContactEmail.count(:all, :joins => :contact, :group => 'contact.company_name')

仮想属性では、セット全体を取得してRuby (テストされていない)を使用する必要があると思います。

ContactEmail.find(:all, :joins => :contact, :select => 'contacts.company_name').group_by(&:company_name).inject({}) {|hash,result_set| hash.merge(result_set.first=>result_set.last.count)}

しかし、それはあなたのシステムを維持するために割り当てられた次の人にはあまり親切ではありません-したがって、.countバージョンのクエリ構文を理解し、列自体を参照する方が良いでしょう。

于 2010-08-17T08:15:30.220 に答える