2016-12-23 9 views
0

フィルタリングするJSONレスポンスにネストされたオブジェクト/リレーションを含める "ベスト"方法についてアドバイスできますか?Rails JSONレスポンス内にネストされたオブジェクト/リレーションを含める

以下の簡単な例では、モデルCommentにソフト削除フラグis_deleted = trueがあるとします。is_deleted = falseのコメントのみを入れたいとします。これを達成する最良の方法は何ですか?

posts = Post.all 
render json: posts.to_json(:include => [:comments]) 

答えて

0

あなただけにコメントやポストフィールドを追加することができ、編集、あなたのモーダル

class Post < ActiveRecord::Base 

    def as_json(_options = {}) 
    super only: [:id, :title], 
      include: { 
      comments: { 
       only: [:id, :comment_fieds] 
      } 
    end 
end 


class Comment < ActiveRecord::Base 
    default_scope { where is_deleted: false } 
end 

:[.....]あなたが応答

posts = Post.all 
render json: posts 
+0

お返事ありがとうございます。私はこれを試しましたが、私たちは "管理者"に削除されたコメントを表示するので、いつもそのスコープを適用したくありません。 –

1

に含めることを、私は可能性があり簡単な解決策を思いついてください。 Postでは、削除されたコメントが出た結果から、このような範囲することができます

has_many :comments, -> { is_deleted: false } 

これは削除されないそれらのコメントを返します。そして、あなたの既存のJSONコードは正常に動作します。

編集1:

このソリューションは、コメントで我々の議論のとおりです。

Postに便利なメソッドを作成します。これにより、削除されていないコメントがすべて返されます。

def visible_comments 
    comments.where(is_deleted: false) 
end 

次のように続いて、あなたのレンダリング方法を変更することができます。

render json: posts.to_json(:include => [:visible_comments]) 

これはPostvisible_commentsメソッドを呼び出しますし、それだけでメソッドから返された結果が含まれます。

+0

答えをありがとう。私はこれを試しましたが、私たちは "管理者"に削除されたコメントを表示するので、いつもそのスコープを適用したくありません。 –

+0

この場合、カスタムスコープを作成することができます。 'scope:visible_comments、 - > {comments.where(is_deleted:false)}'、JSONレンダリングにこのスコープを含めます。 – 31piy

+0

カスタムスコープを組み込むための構文が何であるか知っていますか? –

関連する問題