Ruby - 确保只有一个类对象
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ruby - 确保只有一个类对象相关的知识,希望对你有一定的参考价值。
我有一个模型Bot
,我想确保我的数据库中只有一个Bot
对象。我还需要确保它是持久的而不是被篡改的。
我最初的想法是在迁移中执行此操作,这将遵循:bots
表迁移。它将包括一行如下:
Bot.all.size == 0 ? Bot.create! : nil
也许这会阻止AR对象在将来的迁移中被搞乱?
奖励:能够对此类对象进行即时和全局访问真是太棒了。我想在我的singleton
类中使用Bot
模块,这样我总能引用Bot.instance
并可以访问该特定对象。
使用案例:
我的数据库中有4种类型的用户,这个机器人将成为通过我们的应用内消息传递功能向他们传递特定于角色的消息的促进者。
Class Bot
将与has_many
有BotMessage/bot_messages
联盟。在bot_messages
表上将是user_role
的枚举字段。
消息将由公司管理员创建并存储在这些表中,因为我们希望通过查看用户和Bot之间的“对话”线程随时查看这些消息。
当谈到只有1个机器人时,就是这样。我不需要额外的Bot
对象。此外,由于只有一个对象,因此能够有一种明确定位该对象的方法而不必运行查询来查找它。
例如,与可能有1000条记录的User
不同,为了找到特定的记录,你会做像@user = User.find_by_email('foo@bar.com')
这样的事情,因为只有一条记录可以找到,所以不必为机器人做类似的事情。这就是让我相信在这里有一个singleton
对象可能是值得的,因此每当我需要为特定角色提取消息时,我可以运行Bot.instance.bot_messages.where(user_role: 1)
或类似的东西
根据您的用例,我认为没有理由让Bot
成为一个模型。
假设您有一个名为cool_user
的角色,并且您希望获得该角色的所有bot_messages
,您可以执行以下操作:
class Bot
class << self
def bot_messages(user_role)
BotMessage.send(user_role)
end
end
end
作为评论中非常周到但可能是匿名的超级代码猴子注释,你也可以这样做:
class Bot
def self.bot_messages(user_role)
BotMessage.send(user_role)
end
end
有些人可能会发现更具可读性。 IMO,这是一个个人偏好的问题。
在任何一种情况下,你都应该能够做到
Bot.bot_messages(:cool_user)
因为,如docs所述,
还将提供基于枚举字段的允许值的范围。
所以,我相信BotMessage
,正确设置enum
,应该响应cool_user
并返回所有bot_messages
为该角色。
您可能需要检查docs以获得完全正确的语法。
我相信这也应该满足您的奖金要求。
一个经过验证的解决方案是在STI上使用User
(使用user_type
列)
class User < ApplicationRecord
...
end
class Bot < User
has_many :bot_messages, foreign_key: :user_id
end
这是你在找什么?
以上是关于Ruby - 确保只有一个类对象的主要内容,如果未能解决你的问题,请参考以下文章