【发布时间】:2018-03-02 18:01:44
【问题描述】:
我有一个模型Bot,我想确保我的数据库中只有一个Bot 对象。我还需要确保它被持久化并且未被篡改。
我最初的想法是在迁移中执行此操作,该迁移将遵循:bots 表迁移。它将包括如下一行:
Bot.all.size == 0 ? Bot.create! : nil
也许这会防止 AR 对象在未来的迁移中被弄乱?
奖励:能够对此类对象进行即时和全局访问真是太棒了。我正在考虑在我的Bot 类中使用singleton 模块,这样我就可以始终引用Bot.instance 并可以访问该特定对象。
用例:
我的数据库中有 4 种类型的用户,这个机器人将通过我们的应用内消息传递功能向他们传递特定于角色的消息。
Class Bot 将与BotMessage/bot_messages 有一个has_many 关联。在bot_messages 表上将是user_role 的枚举字段。
消息将由公司管理员创建并存储在这些表格中,因为我们希望通过查看用户和机器人之间的“对话”线程随时查看它们。
如果只有 1 个机器人,就是这样。我不需要额外的 Bot 对象。此外,由于只有一个对象,因此能够有一种方法明确地定位该对象而无需运行查询来找到它。
例如,与 User 可能有 1000 条记录不同,为了找到特定的记录,您需要执行 @user = User.find_by_email('foo@bar.com') 之类的操作,因为只有一条记录可用于机器人,所以没有必要为机器人执行此类操作寻找。这就是让我相信在这里拥有 singleton 对象可能是值得的,所以每当我需要为特定角色提取消息时,我可以运行 Bot.instance.bot_messages.where(user_role: 1) 或类似的东西
【问题讨论】:
-
了解您实际上想要做什么可能会有所帮助。例如,您是否考虑过使用常量而不是数据库记录创建一个普通的旧 ruby 类?
-
我更新了帖子以包含用例场景和对我的需求的解释。
-
听起来您需要将 Bot 的 internals 保存在表格中,例如每个设置一行,并将 Bot 本身作为某种单例包装器那个。
-
你有没有遇到这个问题?
-
嘿,采用了完全不同的方法。不需要单例,因为我只使用了
bot_messages的简单 1 模型方法。
标签: ruby-on-rails ruby activerecord singleton instance