database - 将模块名称存储在数据库中的地图中
问题描述
我正在使用 Elixir/Ecto/Phoenix 为 IOT 应用程序创建通知服务。此应用程序中的传感器可以有多个值,例如
temperature: ["temp"],
accelerometer: ["ax", "ay", "az"]
要创建通用通知策略,我必须将模块名称与传感器一起存储,这将实现处理资格规则的逻辑。此外,由于每个传感器可以具有与其关联的多个值,因此accelerometer -> ax, ay, az
对于不同的值,模块可以是不同的。
schema("acqdat_sensor_notifications") do
field(:rule_values, :map)
field(:alarm_status, :boolean, default: false)
belongs_to(:sensor, Sensor, on_replace: :delete)
timestamps()
end
规则值列将以以下格式存储数据,例如加速度传感器。
%{
"ax" => %{
module: "NotificationPolicyA",
module_preferences: {"prefA": valuea, "prefb": valueb}
},
"ay" => %{
module: "NotificationPolicyB",
module_preferences: {"pref1": value1, "pref2": value2}
},
}
这里的问题是存储将处理逻辑的模块名称。我不能像使用枚举库那样使用枚举库ecto_enum
,因为值存储在一个不是常量的 jsonb 映射中(不能在这里使用嵌入)。它随着传感器名称和用于处理它的模块而不断变化。
目前我正在使用地图处理它
%{
NotificationPolicyA: 0,
NotificationPolicyA: 1
.
.
.
}
然后将整数存储在数据库中,这样如果模块名称被修改,只有映射被改变。
"ax" => %{
module: 0,
module_preferences: {"prefA": valuea, "prefb": valueb}
}
用ecto处理这种情况的替代方法是什么?
解决方案
您可以将模块名称作为字符串存储在数据库中,用于String.to_existing_atom/1
转换它并Kernel.apply/3
运行您需要的任何功能。
例子:
iex(2)> apply(String.to_existing_atom("Elixir.MyApp.Version"), :run, [1])
0.29.1
推荐阅读
- android - Android 开发者可以查看我的 Google Play 帐户吗?
- c# - 测试用例的空 int 输入
- java - 如何将存储过程的结果映射到spring-boot/hibernate中的实体
- r - 使用混淆矩阵找到截止值?
- firebase - 有什么方法可以使用事件参数来触发 Firebase 中的应用内消息?
- php - PHP文件在PWA中的作用
- image - 将图像从 dialogflow 发送到 webhook
- google-cloud-firestore - firestore 文档快照 get() 不适用于包含连字符的字段名称的点字符串表示法
- python - 如何在 python 中使用 webbrowser.open 打开多个 chrome 选项卡
- django - 值错误在 /