Rails禁用特定模型的预先加载

时间:2015-10-15 03:08:26

标签: ruby-on-rails-4 eager-loading activeresource

我正在编写一个Rails应用程序,其功能通过ActiveResource与第三方API(streamsend)连接。我正在使用shopify的ActiveResource分支进行线程安全操作,因为我的应用程序的不同用户将拥有自己的streamsend API客户端ID和密钥,我不希望我的应用程序在与第三方API连接时踩到它们

我的控制器中有一个与private static void initRecyclerBin(AbsListView view) { try { Field localField = AbsListView.class.getDeclaredField("mRecycler"); localField.setAccessible(true); Object recyclerBin = localField.get(view); Class<?> clazz = Class.forName("android.widget.AbsListView$RecycleBin"); Field scrapField = clazz.getDeclaredField("mScrapViews"); scrapField.setAccessible(true); ArrayList<View>[] scrapViews; scrapViews = (ArrayList<View>[]) scrapField.get(recyclerBin); if (null != scrapViews) { int length = scrapViews.length; for (int i = 0, count = 0; i < length; i++) { if (null != scrapViews[i] && !scrapViews[i].isEmpty()) { for (int j = 0; j < scrapViews[i].size(); j++) { scrapViews[i].get(j);//this is the scrapViews } } } } } catch (Exception e) { e.printStackTrace(); } } 过滤器关联的内容:

around_action

在我的模特中:

private

# set StreamSend credentials in every request
def set_ss_credentials
  StreamSend.site,
    StreamSend.user,
      StreamSend.password = current_user_credentials
  yield
ensure
  StreamSend.site =
    StreamSend.user =
      StreamSend.password = nil
end

DEFAULT_SITE, DEFAULT_USER, DEFAULT_PASSWORD = [
Rails.application.secrets.streamsend_api_endpoint, "username", "password" ]

def current_user_credentials
  current_user.present? ?
    [ Rails.application.secrets.streamsend_api_endpoint, current_user.ss_userid, current_user.ss_key ] :
    [ DEFAULT_SITE, DEFAULT_USER, DEFAULT_PASSWORD ]
end

网站和凭据旨在通过控制器操作和登录的当前用户输入。

这在使用WEBrick时工作正常,但由于生产模式下Rails的默认设置为class StreamSend < ActiveResource::Base self.format = :xml def self.audience @audience ||= StreamSend::Audience.find(:first) end end ,我的应用程序将无法启动,因为实际模型缺少网站和凭据。

有没有办法告诉config.eager_load = true忽略我依赖ARes的模型,但是急切地加载我所有的实际数据库模型?

1 个答案:

答案 0 :(得分:0)

在生产模式下启动时的错误来自:

def self.audience
  @audience ||= StreamSend::Audience.find(:first)
end

默认情况下,硬编码audience允许我以生产模式启动应用程序。现在这很好,因为Streamsend每个帐户只支持一个受众。