2016-04-30 1 views
0

ユーザーには3つの役割があり、標準、プレミアム、管理者と呼ばれます。それぞれが投稿を投稿できます。プレミアムと管理者は私的ポストか非プライベートポスト(プライベート:偽かプライベートか)を選択することができます。標準ユーザーには、投稿が非公開/非公開になるかどうかを選択するオプションはありません。デフォルトでは、すべての標準ユーザーの投稿は非公開:nilステータスになります。Ruby on Rails三項演算子を表示するには、nilとfalseの両方が表示されます。

  • 標準ユーザーの投稿は、常にプライベートになります:要約する

  • プレミアム/ Adminユーザーの投稿nilは、民間のいずれかとすることができる:trueまたはプライベート:偽

私がしようとしています標準ユーザーがインデックスページを表示すると、プライベート:nilとプライベート:falseの投稿が表示され、プレミアムと管理者のユーザーはすべてを表示できます。私の問題は、私は、標準ユーザーが非公開:非公開と非公開の両方を見ることを可能にする三項演算子を思いつくことができないということです。

これは私がPostモデルに持っているものです。

scope :visible_to, -> (user) { user.admin? || user.premium? ? all : where(private: false) || where(private: nil)} 

コードだけのプライベートで投稿を表示上:偽。 私は、様々な組み合わせを試してみた:唯一の民間

... where(private: false || nil)} 

ディスプレイ:偽の記事だけのプライベート

... where(private: nil || false)} 

ディスプレイ:nilの記事

:投稿

... where(private: nil && false)} 

のみを表示プライベートnilを

... where(private: false && nil)} 

だけを表示プライベート:偽の記事

や他のいくつかの組み合わせ -

また、私は偽とゼロの順序を切り替えたときに、それは異なる結果を表示することに気づきました。私は思った||または& &演算子は、非可換型です。おそらく、私が気付いていなかったスコープまたは3値演算子について何かがあるかもしれません...

ありがとう!

+0

と一緒のUSINGあなたのケースについては、この記事でアウトアウトでは、[評論家](https://github.com/elabs/pundit)のような認証ライブラリを使用して検討していますか? – mysmallidea

答えて

1

あなたはどこでオペレーターをやるのかと思っていますか? http://guides.rubyonrails.org/active_record_querying.html

2.3.3サブセット条件

... where(private: [false, nil])} 

これは、SQLで複数または文の省略形であるSQL

WHERE private in (false, nil) 

に変換する必要があります。 純粋なSQL文字列に分解することなく、より高度なSQL機能用にarel表を使用することもできます。 AREL例

https://robots.thoughtbot.com/using-arel-to-compose-sql-queries

# It even handles arrays containing nil! 
where(foo: ['bar', 'baz', nil]) # => (WHERE foo IN ('bar', 'baz') OR foo IS NULL) 
+0

それは魔法のように働いた!! (あるいは多分それは魔法そのものだった...)ありがとう!! – Iggy

0

私にとってスコープは、データモデルのスライスを伝える意味があります。このロジックは、設定や設定に応じて、モデルまたはコントローラのいずれかになければなりません。ここには一般的な勧告があります。

nilの値は、その列のデフォルトを設定し、現在のnil値をすべてfalseに移行します。それは、あなたの人生を、虚偽または未定を意味すると推測するのではなく、これらのための決定的な価値を持つことを容易にします。

class User 
    def can_view_private_posts 
    admin? || premium? 
    end 
end 

class Posts 
    scope :private, -> { where(private: false) } 
end 

次に、サービスオブジェクトまたはコントローラに、プライベート投稿を表示できるユーザー間の関係を処理させます。

+0

このようにすることは決して考えられませんでした。ありがとう! – Iggy

関連する問題