5

私のモデルUserでは、スコープが設定されています:

scope :count_likes, lambda { 
     select("(SELECT count(*) from another_model) AS count") 
}

User + count_likes のすべての属性を取得したい場合は、次のようにする必要があります。

Model.count_likes.select("users.*")

select() を呼び出すとデフォルトになるため"*"

私はcount_likesスコープを多くのアプリケーションで使用していますが、どこにでも select("users.*") を追加する必要があるという問題があります。

デフォルトのスコープについては知っていますが、デフォルトのスコープで行うselect("users.*")のは良い考えではないと思います。

これを行うDRY/より良い方法はありますか?

ありがとう

4

2 に答える 2

4

これは実際には別の答えではありません。結合についてコメントを残したかったのですが、コメントは長くなりません。コード例を提供したかったのです。

必要なのは、関連するテーブルのすべてのフィールドとカウントを取得することと、users.* フィールドなしでカウントを取得することです (場合によっては、カウントのない user.* フィールドだけを取得することもあります)。したがって、どちらが必要かをコードに伝える必要があります。あなたが探しているのは、デフォルトではuser.*フィールドとカウントを取得する例外タイプのものだと思いますが、カウントのみが必要な場合は、select('user.*')をオフにするように指定します。おそらくデフォルトのスコープを使用することを除いて、そのような解決策はないと思います。カウントのみのスコープを 1 つと、ユーザー フィールドとカウントのスコープを 1 つ持つことをお勧めします。

これが私がすることです:

class Users
  has_many :likes

  def self.with_count_likes
    joins(:likes)
      .select('users.*, count(likes.id) as count')
      .group('users.id')
  end

  def self.count_likes
    joins(:likes)
      .select('users.id, users.username, count(likes.id) as count')
      .group('users.id')
  end
...

すべてのユーザー フィールドといいね数が必要な場合は、with_count_likes を呼び出します (またはクエリにチェーンします)。カウントといくつかの識別フィールドだけが必要な場合は、count_likes を呼び出します。

ここでは、カウントが必要な場合はいつでも、いくつかのユーザーフィールドでカウントの目的/(誰) を識別する必要があると想定しています。

一部のデータベース (Oracle など) では、「users.*」によるグループ化が必要な場合があることに注意してください。これは SQL の標準ですが、mySQL などの一部のデータベースは主キーのみを使用します。

于 2015-03-25T14:08:05.127 に答える
1

users.*スコープに追加するだけです。

scope :count_likes, lambda { 
     select("(SELECT count(*) from another_model) AS count, users.*") 
}

HTH

編集:何を達成しようとしているのか正確にはわかりませんが、joinsテーブルを適切に結合してデータの使用と取得を検討する必要があります。

編集: 通常、私はそのような変更を行うのが好きではありませんが、状況が示唆するように、手を汚す必要がある場合があります。この場合、変更を加えるという点で操作の数を減らすようにします。検討:

scope :count_likes, Proc.new { |all| s = select("(SELECT count(*) from another_model) AS count"); s = s.select("users.*") unless all == false; s}

今、あなたはusers.*どこにでも行きます。カウントだけが必要な特定の場所については、 likeUser.count_likes(false)に置き換えると、カウントだけが得られます。したがって、最小限の変更。

複数のスコープを一緒に追加する別の可能性があります.1つはカウント用、もう1つusers.*は上記の効果を達成するためにそれらを使用します。

于 2013-11-14T08:36:14.630 に答える