我试图编写一个尝试使用默认TCP设置连接到Redis的函数,如果失败,尝试通过unix套接字连接到Redis.我的意图是有一个适用于我所有系统的连接脚本,其中一些使用TCP,另一些使用套接字.
但是,我似乎无法从失败的TCP连接中解救出来.这是我的测试脚本.
require "redis"
def r
begin
$redis ||= Redis.new
rescue
$redis = Redis.new(:path => "/tmp/redis.sock")
end
end
puts "You have #{r.keys.count} redis keys"
Run Code Online (Sandbox Code Playgroud)
该rescue块永远不会被执行,而是引发异常.这是此脚本的输出.
/usr/local/rvm/gems/ruby-1.9.2-p290/gems/redis-2.2.2/lib/redis/client.rb:236:in `rescue in establish_connection': Connection refused - Unable to connect to Redis on 127.0.0.1:6379 (Errno::ECONNREFUSED)
from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/redis-2.2.2/lib/redis/client.rb:222:in `establish_connection'
from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/redis-2.2.2/lib/redis/client.rb:23:in `connect'
from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/redis-2.2.2/lib/redis/client.rb:247:in `ensure_connected'
from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/redis-2.2.2/lib/redis/client.rb:137:in `block in process'
from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/redis-2.2.2/lib/redis/client.rb:206:in `logging'
from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/redis-2.2.2/lib/redis/client.rb:136:in `process'
from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/redis-2.2.2/lib/redis/client.rb:46:in `call'
from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/redis-2.2.2/lib/redis.rb:246:in `block in keys'
from /usr/local/rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/monitor.rb:201:in `mon_synchronize'
from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/redis-2.2.2/lib/redis.rb:245:in `keys'
from scripts/redis.rb:11:in `<main>'
我已经验证了 …
似乎ActiveRecord的counter_cache功能可能导致计数器缓存增加两次.我看到这种行为的场景是当我有两个模型has_many :through通过连接模型彼此建立关系时(即:Teacher有很多Student通过Classroom).使用has_many :through生成的方法直接关联教师和学生(无需手动创建连接记录)时,计数会增加2倍.示例:teacher.students << Student.create(name: "Bobby Joe")原因teacher.students_count增加2.
请帮助我找到一个解决方案,减轻或消除这个问题,同时允许我继续使用内置的计数器缓存和通过has_many :through关系的质量分配.
我花了很多时间寻找解决方案并将问题提取到一个小的测试应用程序,这是我可以创建的最简单的失败示例.任何有助于我解决这个问题的额外细节都应该在下面.
示例模式和模型:
create_table :teachers do |t|
t.string :name
t.integer :students_count, default: 0
t.timestamps
end
class Teacher < ActiveRecord::Base
has_many :classrooms
has_many :students, :through => :classrooms
end
create_table :students do |t|
t.string :name
t.integer :teachers_count, default: 0
t.timestamps
end
class Student < ActiveRecord::Base
has_many :classrooms
has_many :teachers, :through => :classrooms
end
create_table :classrooms do |t|
t.references …Run Code Online (Sandbox Code Playgroud) 我必须只使用ruby core或stdlib中提供的工具创建一个应用程序.YAML或SQLite是否带有红宝石?有哪些其他工具可以让我将数据存储到文件中?它们的优点和缺点是什么?