我想手动和有条件地处理模型之间的关联。我有一个带有标记功能的应用程序,因此有三种模型:标记,可标记资产和加入模型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,如果它有助于解释我的思考过程。