我有一个简单的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 …
我正在尝试测试某个内部库,该库在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) 我试图通过以下方式为我的一些迁移使用辅助数据库连接:
# 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来配置它的环境,而这个数据库不在我的仓库中.
我们最近更新了我们网站的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 updatebrew upgrade opensslrvm osx-ssl-certs update allrvm install ruby-2.3.1 --disable-binary --with-openssl-dir="$(brew --prefix openssl)" (之前我没有这个版本)rvm requirementscrlrefresh rpv 根据Uzbekjon的建议,清除OSX系统范围的CRL缓存.我该如何解决这个问题?
笔记:
在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) 我正在尝试从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 ×3
activerecord ×1
ajax ×1
jasmine ×1
javascript ×1
jquery ×1
migration ×1
net-http ×1
netbeans ×1
netbeans-6.9 ×1
openssl ×1
ruby-1.9.3 ×1
ssl ×1