数组作为sinatra中的全局变量

时间:2014-03-06 14:11:32

标签: ruby database sinatra

你好我想有数组存储的东西然后我访问它来填充数据库中的一些数据,我想知道如何做到这一点,以及如何将它们声明为全局,你可以解释使用下面的代码

我想使用数组存储一些数据,然后将数据放入数据库中,但我看不到能够这样做:我也在使用DataMapper

这两个post方法必须访问那些我需要弄清楚的全局数组。谢谢(我是sinatra新手)

module Scanner
  class SellItemApp < Scanner::Base

    configure do
      set :in_customer,[] #to be used in adding multiple items
      set :items, [] #to be used in adding multiple items
    end

    get '/something' do
      erb :sale_records
    end

    post '/something1' do
      .........
    end

    post 'something2' do
    .....

    end

  end
end

2 个答案:

答案 0 :(得分:2)

配置适用于静态数据,这些数据在应用程序的生命周期内不会更改,并且不是其状态的一部分。

使用配置在请求之间缓存数据不是一个好主意,原因如下:

  • 全局数据未被隔离 - 当用户在您的应用中添加“项目”时所有其他用户都会看到它,因为它是全局存储的......
  • 内存数据不可扩展 - 只要您在一台计算机上运行单个sinatra实例,此解决方案可能可以正常工作。目前,您的应用程序需要扩展,无论是通过添加计算机,还是使用多个进程(在passengerunicorn容器中) - 一个进程/计算机中的数据更改不会填充到其他进程/机器 - 它将不一致。
  • 不是线程安全的 - 即使你通过使你的应用程序多线程扩展,你只会进入竞争条件和同步块的痛苦世界
  • 这不是持久的 - 如果你的过程由于某种原因失败 - 它的所有状态都会丢失。

那么,应该你做什么?根据您的要求,有几种选择 - 数据是由所有用户共享还是在用户之间隔离?它应该持续一段时间吗?

  • 如果数据属于用户范围,并且只应保留当前会话,则可以使用cookies
  • 使用ActiveRecord保存数据
  • 如果数据是全局的,则应保留可用性,但如果数据丢失则不是灾难 - 您可以使用sessions
  • 如果数据应该保存很长时间,你应该认真考虑坚持下去。它不会 DataMappermysql映射,具体取决于数据的复杂程度。它甚至不必持久保存到像{{1}}这样的关系数据库,像memcachedredis等一些noSql选项可以很容易地添加到你的ruby项目中。

答案 1 :(得分:0)

好吧,如果我理解伦纳德,他想要访问一些他打算用作临时数据库的“配置”变量。从Sinatra documentation引用

set :foo, 'bar'
set :baz, Proc.new { "Hello " + foo }

get '/baz' do
  "baz is set to " + settings.baz
end

而我猜测(还没试过)如果你愿意的话,你可以将你的东西塞进去。但是请注意,如果重新启动服务器,这将丢失(尽管应该继续执行多个请求)。

如果您希望“存储的数据”能够在服务器重启后继续存在DataMapper当然是正确的解决方案。请参阅相应的文档,了解如何执行此操作。对任何类型的数据“存储”使用配置机制可能不是一个好主意。