0

ヘルパー関数を使用して、where 句を埋めたい

私の見解では、私はラインを持っています

<%= f.collection_select(:artikelgroep_id, Artikelgroep.where(artikelgroeps_not_in_users_selection), :id, :omschrijving) %>

ヘルパーで:

module ArtikelgroepsHelper
  def artikelgroeps_not_in_users_selection
    a1='"id NOT IN (SELECT artikelgroep_id FROM user_artikelgroeps WHERE user_id = :uid)"'  + "," +  "{uid: @user.id}"
 end
end

ビューを実行すると、次のメッセージが表示されます。

SELECT `artikelgroeps`.* FROM `artikelgroeps`  WHERE ("id NOT IN (SELECT artikelgroep_id FROM user_artikelgroeps WHERE user_id = :uid)",{uid: @user.id})

プレースホルダーが解決されていないようです。

artikelgroeps_not_in_users_selection の代わりにヘルパーの結果を直接入力すると、正常に動作しています。

プレースホルダーを強制的に解決するにはどうすればよいですか??

4

2 に答える 2

1

モデルにクエリを挿入します。

モデル

model Artikelgroep
  scope :without_user, (user) -> {
    joins(:user_artikelgroeps).where("user_artikelgroeps.user_id != ?", user.id)
  }
end

見る

<%= f.collection_select(:artikelgroep_id, Artikelgroep.without_user(@user), :id, :omschrijving) %>
于 2013-10-29T21:01:14.377 に答える
1

これは間違った方法です (代わりにスコープを使用します) が、これを機能させるには、メソッドから引数の配列を返し、それらをwherewithに渡す必要がありsendます。

module ArtikelgroepsHelper
  def artikelgroeps_not_in_users_selection
    ['"id NOT IN (SELECT artikelgroep_id FROM user_artikelgroeps WHERE user_id = :uid)"', {uid: @user.id}]
  end
end

Artikelgroep.send(:where, *artikelgroeps_not_in_users_selection)

これらすべての代わりに、スコープを定義する必要があります。

class Artikelgroep < ActiveRecord::Base
  scope not_in_users_selection, (user_id) ->
    where('id NOT IN (SELECT artikelgroep_id FROM user_artikelgroeps WHERE user_id = ?)', user_id)
    # OR 
    where('id NOT IN (?)', UserArtikelgroeps.where(user_id: user_id).pluck(:id))
end

# Usage:
Artikelgroep.not_in_users_select(@user.id)
于 2013-10-29T20:52:49.343 に答える