小编jsh*_*kol的帖子

在执行Rails资产时如何运行某些初始化程序:预编译?

背景

我有一个应用程序,我最近更新到Rails 3.2.1(来自Rails 3.0.x)并重构了JS和CSS资产以利用新的资产管道.该应用程序托管在Heroku上,带有Celadon Cedar堆栈.

App配置

我将特定于应用程序的配置保存在名为app_config.yml的YAML文件中,并使用初始化程序将其加载到全局APP_CONFIG变量中:

# config/initializers/load_app_config.rb

app_config_contents = YAML.load_file("#{Rails.root.to_s}/config/app_config.yml")
app_config_contents["default"] ||= {}
APP_CONFIG = app_config_contents["default"].merge(
                       app_config_contents[Rails.env] || {} ).symbolize_keys
Run Code Online (Sandbox Code Playgroud)

Heroku上的资产编译

Heroku支持内置于Cedar堆栈的Rails资产管道.当您将应用程序推送到Heroku时,它会自动调用rake assets:precompile服务器作为部署过程中的一个步骤.但是,它在没有数据库访问或正常ENV变量的沙盒环境中执行此操作.

如果允许应用程序在资产预编译期间正常初始化,则会尝试连接到数据库时发生错误.通过将以下内容添加到application.rb文件中可以轻松解决此问题:

    # Do not load entire app when precompiling assets
    config.assets.initialize_on_precompile = false
Run Code Online (Sandbox Code Playgroud)


我的问题

initialize_on_precompile = false设置,没有在初始化的config/initializers/*被运行.我遇到的问题是我需要APP_CONFIG变量在资产预编译期间可用.

如何load_app_config.rb在不初始化整个应用程序的情况下在资产编译期间加载?我可以使用group传递给Rails :: Application.initialize 的参数做些什么!?

heroku ruby-on-rails-3 ruby-on-rails-3.1 asset-pipeline ruby-on-rails-3.2

17
推荐指数
2
解决办法
6014
查看次数

Rails/ActiveRecord悲观锁定 - 获取锁后我需要重新加载吗?

我在Rails中有一个交易模型,代表一个金融交易,将从信用卡中扣除.

创建事务时,它的状态为:new.当我尝试解决费用(将在DelayedJob中发生)时,我将状态更新为:pending.charge如果状态不是,则将忽略任何后续调用:new.

天真版本(不关心并发):

# Trigger a card to be charged
def charge_transaction
  return unless status == :new

  self.transaction do
    self.delay.settle_credit_card
    self.update_attribute(:status, :pending)
  end
end

# Actually do the charging (in a delayed worker)
def settle_credit_card
   # ... Interact with our payment gateway
end
Run Code Online (Sandbox Code Playgroud)

由于这是一个load_balanced Web应用程序,我想确保我们考虑并发性而不是创建重复费用(由于并发请求).我理解乐观锁定的好处,但在这种情况下,我不介意拥有这个关键区域,因为同时尝试收费(或以任何方式更新交易)应该是一个例外情况.

这是尝试使用悲观的行级锁定

并发版本(选项1)

# Trigger a card to be charged
def charge_transaction

  # Obtain row-lock
  self.with_lock do
    self.reload # Reload once lock is obtained - necessary?

    # Check …
Run Code Online (Sandbox Code Playgroud)

concurrency activerecord locking delayed-job ruby-on-rails-3

9
推荐指数
1
解决办法
3349
查看次数