凤凰城

时间:2016-06-06 14:49:15

标签: elixir phoenix-framework ecto

我想手动和有条件地处理模型之间的关联。我有一个带有标记功能的应用程序,因此有三种模型:标记,可标记资产和加入模型AssetTag。我希望Assets能够处理使用预先存在的标签以及用户在创建/更新资产时可以在Asset的“tags”属性中指定的新标签进行标记。我猜测传入的JSON看起来像这样:

{
  "item_number": "ITEM_NUMBER",
  "name": "Sample Asset",
  "description": "A sample asset.",
  "type": "print",
  "url": "http://www.example.com",
  "tags": [
    "sample asset",
    "arbitrary tag"
  ]
}

我假设我的方法应该是首先遍历“tags”中的每个条目,如果数据库中有相同的name,则加载Tag,否则创建一个新的。然后,对于找到的每个标签,创建一个链接资产和标签的AssetTag。然后,创建或更新资产。

我很困惑的是如何手动处理新的/更新的Asset属性,以及该代码的存在位置。我的第一个猜测是,代码将位于changeset中的asset.ex下:

def changeset(model, params \\ :empty) do
  model
  |> load_or_create_tags
  |> create_asset_tags
  |> cast(params, @required_fields, @optional_fields)
end

def load_or_create_tags(model) do
 # do stuff here
end

def create_asset_tags(model) do
 # do stuff here
end

但是我必须在Asset模块中引用Tag和AssetTag,这感觉有点脏。我也不喜欢直接改变变更集功能的想法。

我也不确定这是如何运作的。我知道我不能只在变更集中间向数据库添加模型,所以我假设我必须把所有内容都放在insert语句之前。这也是一个涉及协调三个不同模型(Asset,Tag,AssetTag)的过程,我不认为这样的代码属于单个模型,但我不知道它会去哪里。

我的方法有意义吗?我该如何手动处理,我在哪里放置代码?我习惯了Rails,如果它有助于解释我的思考过程。

0 个答案:

没有答案