3

スコープ内の SQL クエリに問題があります。フォームで使用するために、一意の Project.titles とそれに付随する ID のコレクションを返す必要があります。

を使用して個別のタイトルを取得できます

scope :unique_title, select("DISTINCT title")

しかし、結果のオプションで値が得られません

= project_form.input :id, collection: current_user.projects.unique_title

結果:

<select>
  <option value>Item 1</option>
  <option value>Item 2</option>
  <option value>Item 3</option>
</select>

したがって、id をスコープに追加します。

scope :unique_title, select("DISTINCT title").select("id")

結果は私に値を与えますが、今私の DISTINCT 選択は機能しません:

<select>
  <option value="1">Item 1</option>
  <option value="2">Item 2</option>
  <option value="3">Item 3</option>
  <option value="4">Item 2</option>
  <option value="5">Item 2</option>
  <option value="6">Item 2</option>
</select>
4

3 に答える 3

7

Distinct個性を残したセレクトとは別のフィールドを選ぶことはできないと思います。

GROUP BYRailsで次のように使用できるものを探していると思います:

scope :unique_title, select("id, title").group("title")

ただし、これは同じタイトルを持つグループから最初のものだけを選択します。すべてのレコードが必要だが、タイトルに従ってグループ化する必要がある場合は、すべてのレコードを取得してから Ruby からグループ化する必要があります。

scope :titles, select("id, title")

次に、スコープを使用する場所で、sh:

Model.titles.all.group_by(&:title).each do |distinct_title, records|
  # do something with the distinct title and records having that distinct title
end
于 2012-02-09T09:50:46.360 に答える
0

私はこれを解決するために別のアプローチを取りました。

プロジェクト モデルの新しい列

$ rails g migration add_template_to_project template:boolean

モデルに追加

before_create :check_if_exists

def check_if_exists
  toggle!(:template) if title.exists?
end

次に、スコープは次のようになります。

scope :unique_title, select("id, title").where(template: true)

魅力的な作品

于 2012-02-10T09:35:26.100 に答える
0

私はしばらくSQLをやっていなかったので、これはうまくいかないかもしれませんが、私は.select("id, title DISTINCT)

PS : Rails 3.2 を使用explainしている場合は、どのクエリが実際に使用されているか (少なくともできると思いますが、まだ試していません)、および期待どおりに機能しない理由を確認するために使用できます。

于 2012-02-09T09:34:59.413 に答える