1

Railsアプリに次のスコープがあります。これは、にChoices基づいてデータベースからアクティブをフェッチするために使用されますcurrent_user。これは問題なく機能しますが、コードがない場合は、データベース内のcurrent_userすべてをフェッチChoicesします。ここでは、何もフェッチしないようにします。

scope :active,  lambda{|user| user ? { :conditions => ["deliverydate = ? and user_id = ?", Date.tomorrow, user.id], :order => 'id DESC'} : {} }

上記のあなたを書き直して、何もない場合に何も返さないようにするにはどうすればよいcurrent_userですか?

問題は、Pusherを使用して新しいデータをWebサイトにプッシュしていることですが、ユーザーセッションが期限切れになると、すべてのデータが何もプッシュされずにプッシュされます。これが理にかなっていることを願っています:)

4

3 に答える 3

4

スコープはインスタンスを返すため、ここで説明するように空のオブジェクトActiveRecord::Relationを返す方が適切です。ActiveRecord::Relation

したがって、:noneトリックを実行するスコープを追加する必要があります。

scope :none, limit(0)

次に、スコープ内で次のように使用します。

scope :active, ->(user = nil) { user ? { :conditions => ["deliverydate = ? and user_id = ?", Date.tomorrow, user.id], :order => 'id DESC'} : none }
于 2012-12-04T09:01:41.250 に答える
2

これは、空のハッシュ({})に条件がないためです。これは、基本的にすべての行を返すことを意味します。

コードの構造に基づいて、、または常に行を返さないような条件を:id => -1作成:id => nilでき1=0ますfalse

(そして、あなたの質問の下のコメントで述べたように、スコープは連鎖できないので、nilを返すべきではありません。)

于 2012-12-04T08:44:39.420 に答える
2
scope :active,  lambda{|user| user ? { :conditions => ["deliverydate = ? and user_id = ?", Date.tomorrow, user.id], :order => 'id DESC'} : nil }
于 2012-12-04T08:49:25.543 に答える