1

Railsには次のスコープがあります。

scope :with_active_services, Contact.joins(:i_services, :c_services).merge(IService.enabled).merge(CService.enabled)

私が達成しようとしているのは、i_servicesまたはc_servicesのいずれかを有効にしている連絡先を選択することです。連絡先は両方を持っている必要はありません。

私は頭を動かすことができないいくつかの問題に遭遇しました。

現時点でのスコープの状態は、連絡先が有効なi_serviceとc_serviceの両方を返す必要があることを意味します。

生成されたSQLを取得し、WHERE条件のANDをORに変更すると、連絡先にc_serviceとi_serviceの両方を返す必要があるという問題が発生します。

要件を満たすためにこれを変更するにはどうすればよいですか?

ありがとう。

4

1 に答える 1

0

派手な SQL のタッチでこれを行うことができます。このようなもの:

scope :with_active_services ->() {
  joins("LEFT JOIN i_services ON contact.id = i_services.contact_id AND i_services.enabled")
  .joins("LEFT JOIN c_services ON contact.id = c_services.contact_id AND c_services.enabled")
  .group(:id)
  .where("(count(i_services.id) + count(c_services.id)) > 0")
}

これにより、有効なサービスに参加していない連絡先が除外されます。

于 2013-02-05T02:14:15.180 に答える