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 回答