has_many - 给定范围限制为一个(例如,给定评论的每个用户 1 个赞)

has_many - limit to just one for a given scope (e.g. 1 like per user for a given comment)

我希望标题中的描述足够解释,但要详细说明一点,有这样的模型(我脑子里写的,如果有任何轻微的语法错误等,请原谅):

defmodule MyApp.Like do
  use Ecto.Schema
  import Ecto.Changeset

  schema "likes" do
    belongs_to :user, MyApp.User
    belongs_to :comment, MyApp.Comment

    timestamps()
  end
end

defmodule MyApp.Comment do
  use Ecto.Schema
  import Ecto.Changeset

  schema "comments" do
    belongs_to :user, MyApp.User
    has_many :likes, MyApp.Likes

    timestamps()
  end
end

defmodule MyApp.User do
  use Ecto.Schema
  import Ecto.Changeset

  schema "users" do
    has_many :comments, MyApp.Comment
    has_many :likes, MyApp.Like

    timestamps()
  end
end

现在:我已将所有内容设置为可以创建喜欢的方式,没问题。但我不太清楚如何限制用户,因此 he/she 每条评论最多只能有一个赞。

如果这可以帮助任何人向我解释,我来自 Rails 背景并且才开始探索 Elixir/Phoenix 的功能范例。

在数据库级别 likes table 中定义唯一键 (user_id, comment_id)

顺便说一句,在Rails和世界上存在的任何其他编程语言/框架中,这个问题正在以同样的方式解决。