2016-09-21 12 views
1

私はhas_manyの関連付けを持つエクトモデルを持っています。私はデフォルトでいくつかのクエリでこの関連付けを定義したいと思います。私はdeletedではありませんコメントを取得したいエクト - 特定のクエリで `has_many`を取得する方法

defmodule MyApp.User do 
    use MyApp.Web, :model 

    schema "users" do 
    has_many :comments, MyApp.Comment 
    end 
end 

同様

は(MyApp.Commentスキーマのブールフィールドであり、それはfalseに等しくあるべき削除)。それを達成する方法は何ですか?

私のtry#1

私は

has_many :comments, Ecto.Query.from(c in MyApp.Comment, where: v.deleted == false) 

を実行しようとしました。しかし、私はあなたがPostCommentモデルを持っていることを提供

(ArgumentError) association queryable must be a schema or {source, schema}, got: #Ecto.Query 
+0

私はこれが可能ではないと思います。 Ectoにはアクティブレコードのようなスコープという概念はありません。私が提案できる最も近いことは、 'user_ex'に' active_comments'の行に沿って関数を作成することです。 –

答えて

0

を持って、あなたは、非を見つけることができますEcto.Queryの助けを借りてコメントを削除し、次にEcto.Repoを削除しました。

query = from c in Comment, 
     where c.deleted == false, 
     select: c 

comments = MyApp.Repo.all(query) # This will give you all the non-deleted comments 

また、次のクエリをアプリケーションで使用することもできます。

alias MyApp.{Post,Comment} 

query = from p in Post, 
     join: c in assoc(p, :comments), 
     where: c.deleted == false, 
     select: {p, c} # for comments only - just select: c. 

Blog.Repo.all(query) 
+0

私はそれを知っています、ありがとう。しかし、どのようにしてこのような関連付けをスキーマブロックで指定できますか?それは質問 – asiniy

+0

ああです!一般的に私はモデルにメソッドを作成し、それをコントローラアクションで使用します。それは明確かつ容易に構成することができます。 これは興味深いですが、私はこのようなことをしている人は見たことがありません。 – arpit

関連する問題