Ruby - 确保只有一个类对象

时间:2018-03-02 18:01:45

标签: ruby-on-rails ruby activerecord singleton instance

我有一个模型Bot,我想确保我的数据库中只有一个Bot对象。我还需要确保它是持久的而不是被篡改。

我最初的想法是在迁移中执行此操作,该迁移将遵循:bots表迁移。它将包括一行如下:

Bot.all.size == 0 ? Bot.create! : nil

这可能会阻止AR对象在将来的迁移中被搞乱?

BONUS:能够对此类对象进行即时和全局访问真是太棒了。我正在考虑在我的singleton类中使用Bot模块,这样我总是可以引用Bot.instance并且可以访问该特定对象。

使用案例:

我的数据库中有4种类型的用户,这个机器人将通过我们的应用内消息传递功能为他们提供特定于角色的消息。

Class Bothas_manyBotMessage/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)或类似的东西

2 个答案:

答案 0 :(得分: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

某些人可能发现更具可读性。国际海事组织,这是一个个人偏好的问题。

在任何一种情况下,你都应该能够做到

Bot.bot_messages(:cool_user)

因为,如docs中所述,

  

还将提供基于枚举字段的允许值的范围。

因此,我相信BotMessage,如果设置正确enum,则应回复cool_user并返回该角色的所有bot_messages

您可能需要检查docs以获得完全正确的语法。

我相信这也应该满足您的奖金要求。

答案 1 :(得分:0)

经过验证的解决方案是在 <?php function test_scripts() { wp_enqueue_style( 'test-style', get_stylesheet_uri() ); wp_enqueue_style( 'test-responsive', get_template_directory_uri() . '/assets/css/responsive.css'); wp_enqueue_style( 'test-animate', get_template_directory_uri() . '/Assets/css/animate.css'); wp_enqueue_style( 'test-component', get_template_directory_uri() . '/Assets/css/component.css'); wp_enqueue_script( 'test-scripts', get_template_directory_uri() . 'Assets/js/scripts.js'); } add_action( 'wp_enqueue_scripts', 'test_scripts' ); 上使用STIUser列)

user_type

这是你在找什么?