gpt4 book ai didi

elixir - 是否可以编写一个联合多个表的 Ecto 查询,而无需编写原始 SQL?

转载 作者:行者123 更新时间:2023-12-02 04:07:31 25 4
gpt4 key购买 nike

背景:

我正在写一个简单的问答网站。与 Stackoverflow 非常相似,在此站点中,用户可以对问题、答案或评论点赞/投票。

问题:

我正在努力编写一个 Ecto 查询,它可以返回用户喜欢/点赞的所有问题、答案或评论。

具体来说,我想编写一个查询:

  1. 以单个列表的形式返回特定用户投票的所有问题、评论和答案
  2. 并按投票时间对问题、答案和评论进行排序

这个查询似乎可能需要 UNION,即 not yet supported by ecto 2.0据我了解。

因此,我想知道是否有人可以向我展示或指出在 Ecto 中解决此类查询的正确方向。感谢您的任何帮助。

以下是相关模型的架构。

...

schema "users" do
...

has_many :answer_upvotes, AnswerUpvote
has_many :comment_upvotes, CommentUpvote
has_many :question_upvotes, QuestionUpvote

many_to_many :upvoted_answers, Answer, join_through: AnswerUpvote
many_to_many :upvoted_comments, Comment, join_through: CommentUpvote
many_to_many :upvoted_questions, Question, join_through: QuestionUpvote

timestamps
end

...

schema "answer_upvotes" do
belongs_to :answer, Answer
belongs_to :user, User

timestamps
end

...

schema "comment_upvotes" do
belongs_to :comment, Comment
belongs_to :user, User

timestamps
end

...

schema "question_upvotes" do
belongs_to :question, Question
belongs_to :user, User

timestamps
end

...

schema "questions" do
...

belongs_to :user, User

has_many :answers, Answer
has_many :upvotes, QuestionUpvote

many_to_many :upvoting_users, User, join_through: QuestionUpvote

timestamps
end

...

schema "answers" do
...

belongs_to :question, Question
belongs_to :user, User

has_many :comments, Comment
has_many :upvotes, AnswerUpvote

many_to_many :upvoting_users, User, join_through: AnswerUpvote

timestamps
end

...

schema "comments" do
...

belongs_to :answer, Answer
belongs_to :user, User

has_many :upvotes, CommentUpvote

many_to_many :upvoting_users, User, join_through: CommentUpvote

timestamps
end

编辑

我可以编写查询来按问题、答案或项目的投票日期分别对它们进行排序。

例如:

upvoted_answers_query =
from answer in Answer,
join: upvote in assoc(answer, :upvotes), where: upvote.user_id == ^user.id,
order_by: upvote.inserted_at
select: answer

但我不确定如何编写一个单一的 Ecto 查询,该查询可以检索用户所有投票的问题、答案和评论,而无需使用联合或编写原始 SQL。

最佳答案

Ecto v3.0.0 (2018-10-29) 添加了对 unionunion_all 的支持。

文档示例:

supplier_query = from s in Supplier, select: s.city
from c in Customer, select: c.city, union: ^supplier_query

https://hexdocs.pm/ecto/Ecto.Query.html#union/2

关于elixir - 是否可以编写一个联合多个表的 Ecto 查询,而无需编写原始 SQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38690543/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com