小编Ami*_*itA的帖子

散列中的ActiveRecord对象不是垃圾收集 - 一个错误或一种缓存功能?

我有一个简单的ActiveRecord模型Student,在表中有100条记录.我在rails控制台会话中执行以下操作:

ObjectSpace.each_object(ActiveRecord::Base).count
# => 0

x = Student.all

ObjectSpace.each_object(ActiveRecord::Base).count
# => 100

x = nil
GC.start

ObjectSpace.each_object(ActiveRecord::Base).count
# => 0     # Good!
Run Code Online (Sandbox Code Playgroud)

现在我做以下事情:

ObjectSpace.each_object(ActiveRecord::Base).count
# => 0

x = Student.all.group_by(&:last_name)

ObjectSpace.each_object(ActiveRecord::Base).count
# => 100

x = nil
GC.start

ObjectSpace.each_object(ActiveRecord::Base).count
# => 100     # Bad!
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么会发生这种情况,是否有一种聪明的方法可以在不知道底层哈希结构的情 我知道我可以这样做:

x.keys.each{|k| x[k]=nil}
x = nil
GC.start
Run Code Online (Sandbox Code Playgroud)

它会正确地从内存中删除所有的Student对象,但我想知道是否有一个通用的解决方案(我的现实问题是广泛传播,并且具有比上面显示的散列更复杂的数据结构).

我正在使用Ruby 1.9.3-p0和Rails 3.1.0.

更新(已解决)

根据Oscar Del Ben在下面的解释,在有问题的代码片段中创建了一些ActiveRecord :: Relation对象(它们实际上是在两个代码片段中创建的,但由于某种原因,它们仅在第二个代码片段中"行为不端".为什么?).它们通过名为@records的实例变量维护对ActiveRecord对象的引用.可以通过ActiveRecord :: Relation上的"reset"方法将此实例变量设置为nil.您必须确保在所有关系对象上执行此操作:

ObjectSpace.each_object(ActiveRecord::Base).count
# => 100

ObjectSpace.each_object(ActiveRecord::Relation).each(&:reset)

GC.start
ObjectSpace.each_object(ActiveRecord::Base).count
# => 0
Run Code Online (Sandbox Code Playgroud)

注意:你也可以使用Mass.detach(使用ruby-mass gem Oscar …

ruby garbage-collection ruby-on-rails-3.1 ruby-1.9.3

29
推荐指数
1
解决办法
3363
查看次数

Rails + Jasmine-Ajax:测试由`ajax:success`(jquery-ujs)触发的代码的正确方法是什么

我正在尝试测试某个内部库,该库在ajax:success事件上触发了一些JS行为.

该库创建一个如下所示的链接:

<%= link_to 'click here', '/some_path', class: 'special-link', remote: true %>
Run Code Online (Sandbox Code Playgroud)

在库的JS部分有事件绑定代码,这是我想通过它对DOM的影响进行黑盒测试的部分:

$(document).on 'ajax:success', '.special-link', (e, data, status, xhr) ->
  # Code that has some effect on the DOM as a function of the server response
Run Code Online (Sandbox Code Playgroud)

该库在浏览器中按预期工作.但是,当我尝试通过调用在Jasmine中测试库时$('.special-link').click(),无法观察到对DOM的理想效果.

似乎问题是ajax:success事件没有被触发:

describe 'my library', ->
  beforeEach ->
    MagicLamp.load('fixture') # Fixture library that injects the link above to the DOM
    jasmine.Ajax.install()
    jasmine.Ajax.stubRequest('/some_path').andReturn({
      responseText: 'response that is supposed to trigger some effect on the DOM'})

  afterEach …
Run Code Online (Sandbox Code Playgroud)

javascript ajax jquery ruby-on-rails jasmine

10
推荐指数
1
解决办法
440
查看次数

多个数据库连接:在错误的数据库中查找schema_migrations

我试图通过以下方式为我的一些迁移使用辅助数据库连接:

# app/models/staging/migration.rb
class Staging::Migration < ActiveRecord::Migration
    def self.connection
        ActiveRecord::Base.establish_connection(:staging_db).connection
    end
end

# db/migrate/<timestamp>_create_foo.rb
class CreateFoo < Staging::Migration
    ....
end
Run Code Online (Sandbox Code Playgroud)

在我的database.yml中配置了staging_db连接.

当我运行rake db:migrate时,表foo在staging_db模式中正确创建,表schema_migrations在RAILS_ENV =开发连接中创建.但是db:migrate报告以下错误(后续迁移失败):

表'staging_db.schema_migrations'不存在

有没有办法告诉Staging :: Migration在当前的RAILS_ENV连接中查找schema_migrations表?

顺便说一下,我知道staging_db不是RAILS_ENV感知的事实.这对我来说很好,因为每个服务器都通过一个单独的database.yml来配置它的环境,而这个数据库不在我的仓库中.

migration activerecord ruby-on-rails ruby-on-rails-3

8
推荐指数
1
解决办法
2767
查看次数

证书续订后,Ruby Net :: HTTP响应OpenSSL :: SSL :: SSLError"证书验证失败"

我们最近更新了我们网站的SSL证书,并在Mac OS El Capitan 10.11.3上发生以下情况:

require 'net/http'

Net::HTTP.get URI('https://www.google.com')
# => "<HTML>...</HTML>"

# The site whose certificate got renewed
Net::HTTP.get URI('https://www.example.com')
# => OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=error: certificate verify failed
Run Code Online (Sandbox Code Playgroud)

我在Google和StackOverflow上的所有搜索都提出了表明Ruby安装存在问题的答案,但它们似乎与较旧的Ruby版本有关,我认为这不是这种情况.这是我尝试过的:

  • brew update
  • brew upgrade openssl
  • rvm osx-ssl-certs update all
  • rvm install ruby-2.3.1 --disable-binary --with-openssl-dir="$(brew --prefix openssl)" (之前我没有这个版本)
  • rvm requirements
  • crlrefresh rpv 根据Uzbekjon的建议,清除OSX系统范围的CRL缓存.

我该如何解决这个问题?

笔记:

  • 在没有Ruby 2.2.3的新安装的Linux Docker容器上不会出现此问题.所以也许这与Mac OS或SSL本地缓存有关.
  • 证书续订之前可能存在此问题.我无法确定.但是,正如我在这个问题中讨论的那样,更新确实会导致与我们正在使用的第三方类似的问题.
  • Namecheap验证证书安装是否正确,在线检查器显示一切正常,所有主要浏览器都将证书显示为有效.

在BoraMa的帮助下,现在很清楚发生了什么.COMODO添加了一个名为COMODO RSA Certification Authority而不是之前的新根COMODO Certification Authority.新的root用户未在Mac的钥匙串中注册,导致此问题.

我们尝试调试此方法的一种方法是运行:

openssl s_client -connect www.mysite.com:443 …
Run Code Online (Sandbox Code Playgroud)

ruby ssl openssl ssl-certificate net-http

6
推荐指数
1
解决办法
4437
查看次数

Netbeans上的Rails:未捕获的异常:没有要加载的文件 - 脚本/服务器或脚本/控制台

我正在尝试从Netbeans 6.9.1(刚升级)启动Rails 3控制台并失败

Uncaught exception: no such file to load -- script/console
Run Code Online (Sandbox Code Playgroud)

调试器在类似的错误(... -- script/server)上也会失败.

我试图运行它的项目以前是我升级的Rails 2.3.8应用程序,Netbeans仍然尝试做旧的ruby script/console命令而不是rails c.

我试图安装这里描述的补丁,但它没有用. gem list收益:

*** LOCAL GEMS ***

abstract (1.0.0)
actionmailer (3.0.1, 3.0.0.rc2)
actionpack (3.0.1, 3.0.0.rc2)
activemodel (3.0.1, 3.0.0.rc2)
activerecord (3.0.1, 3.0.0.rc2)
activeresource (3.0.1, 3.0.0.rc2)
activesupport (3.0.1, 3.0.0.rc2)
archive-tar-minitar (0.5.2)
arel (2.0.2, 1.0.1, 1.0.0.rc1)
builder (2.1.2)
bundler (1.0.5, 1.0.0.rc.6)
columnize (0.3.2)
crack (0.1.8)
erubis (2.6.6)
httparty (0.6.1)
i18n (0.4.2)
jrails (0.6.0)
linecache19 (0.5.11) …
Run Code Online (Sandbox Code Playgroud)

ruby netbeans ruby-on-rails netbeans-6.9 ruby-on-rails-3

5
推荐指数
1
解决办法
4083
查看次数