【问题标题】:Using a database within a Ruby gem在 Ruby gem 中使用数据库
【发布时间】:2015-07-26 02:36:59
【问题描述】:

我想在我正在编写的 Ruby gem 中使用数据库。该 gem 旨在用于 Rails 应用程序,并将包含从 Rails 主应用程序传入的文档的倒排索引。

我对如何处理这件事有点困惑。我应该以某种方式连接到主 Rails 数据库吗?或者我应该有一个独立的数据库?理想情况下,我只想使用 ActiveRecord 来创建、更新、删除和查询条目,但我不确定如何设置。

此时数据将进入数据库:

module ActiveRecordExtension
  extend ActiveSupport::Concern

  class_methods do
    def foo
      "bar"
    end
  end

  included do
    after_save :add_to_inverted_index
  end

  def add_to_inverted_index
    # This is where I'd take the fields from the Rails app
    # and include them to my inverted index. However, I'm struggling
    # to find a way to hook into a database from my gem to do this.
  end
end
# Include the extension 
ActiveRecord::Base.send(:include, ActiveRecordExtension)

非常感谢您的建议!谢谢

【问题讨论】:

  • 您需要用户告诉您的 gem,他想在您的 gem 中“注入”/使用的模型是什么。你可以通过多种方式让他这样做,从函数到参数、配置文件等等……
  • 是的,我已经收到要“注入”的模型,只要用户执行class Model < ActiveRecord::Base; require 'mygem'; end 之类的操作。我的问题更多的是,一旦我从模型中收到数据,我如何将它从我的 gem 中添加到数据库中?

标签: ruby-on-rails gem


【解决方案1】:

在你澄清之后,你应该使用主要的 Rails 数据库。只需创建一个迁移并插入您需要的表。你应该这样做,因为:

  • 使用您的 gem 的每个人都会知道数据库中存储的内容。
  • 借助迁移,您可以轻松回滚迁移,如果需要,可以轻松地撤消某些操作。
  • 无需创建额外的依赖项。想象一下您在 RoR 中所做的一个项目,并想如果您使用的每个 gem 都创建自己的数据库会是一团糟。

也许您应该看看已知的宝石以及它们是如何做到的。我在考虑Devise

【讨论】:

  • 嗯,Devise 确实是一个 Rails 引擎,因此您为此制作引擎而不是 gem 可能是个好主意。如果我使用引擎,它只会连接到用户决定使用的任何数据库,对吗?
  • 当然。但这是您需要谨慎做出的决定,因为我们/我不知道您的宝石的详细信息/用途。
  • 我正在尝试为 Rails 应用程序实现一个小型全文搜索引擎。我开始制作 gem,基本逻辑就在那里,但我很难使用数据库部分来创建倒排索引。
猜你喜欢
  • 1970-01-01
  • 2017-09-23
  • 1970-01-01
  • 1970-01-01
  • 2012-03-23
  • 2021-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多