小编Kev*_*vin的帖子

我可以在Elixir中连接字符串并使用管道运算符吗?

在Elixir中,您可以使用<>运算符连接字符串,例如"Hello" <> " " <> "World".

您还可以使用管道运算符|>将函数链接在一起.

我正在尝试编写Elixir代码来格式化在线游戏的货币.

def format_price(price) do
  price/10000
  |> Float.round(2)
  |> to_string
  |> <> "g"
end
Run Code Online (Sandbox Code Playgroud)

以上结果导致语法错误.我是否忽略了可以连接字符串的基本功能?我知道我可以自己定义一个,但如果我可以避免它,那似乎在我的代码中创建了不必要的混乱.

我意识到我可以通过简单地将方法链接在一起来完成同样的事情,to_string(Float.round(price/10000, 2)) <> "g"但是这种语法并不像阅读那么好,并且如果我想在以后添加步骤,那么将来扩展该方法会更加困难. .

Elixir是否有方法使用管道运算符连接文本,或者如果没有自己定义方法,这是不可能的?

string-concatenation elixir

27
推荐指数
2
解决办法
5483
查看次数

Ecto put_assoc 为什么预加载和为什么需要 id

在向现有模型添加新关联时,我对 Ecto 感到相当困惑。假设我有一些用户可以喜欢帖子的讨论板,我有以下模型:

  schema "discussion_items" do
    many_to_many :likes, XXX.Tag, join_through: "discussion_items_likes"
    timestamps()
  end

  schema "likes" do
    belongs_to :user, XXX.User
    timestamps()
  end
Run Code Online (Sandbox Code Playgroud)

现在假设我有一个现有的DiscussionItem,我想为此添加一个类似的关联,这是我正在尝试的(简化):

user = Repo.one(User)
discussion_item = Repo.one(from d in DiscussionItem, preload [:likes])

like_changeset = Like.changeset(%Like{})
                     |> Ecto.Changeset.put_assoc(:user,   user)
changeset = Ecto.Changeset.change(discussion_item) 
                |>  Ecto.Changeset.put_assoc(:likes, [like_changeset])

Ecto.update!(changeset)
Run Code Online (Sandbox Code Playgroud)

我发现这将在第一次正确创建 Like 和关联,但之后抱怨我需要一些 id 形式的附加信息:

您正在尝试更改关系:喜欢 XXX.DiscussionItem,但缺少数据

如果您尝试更新现有条目,请确保在数据旁边包含条目主键 (ID)。

如果你有很多孩子的关系,那么更新时至少要给同样的N个孩子。默认情况下,不可能孤立嵌入或关联的记录,尝试这样做会导致此错误消息。

所以这是让我困惑的事情(有一些):

  1. 此错误消息似乎表明,为了更新一个关联的项目,我需要提供一个包含所有项目的更改集,包括更改的项目。这看起来很疯狂,所以我猜我读错了。
  2. 我不想更新喜欢的关联——我想添加一个。put_assoc 在这里是错误的选择吗?
  3. 我真的需要预先加载喜欢的东西才能插入一个项目吗?即使在更新时,我也不想加载整个关联集合来更改一个。
  4. 我需要在这里加载User并Dicussion_item添加一个赞吗?

elixir ecto phoenix-framework

4
推荐指数
1
解决办法
2384
查看次数