• 记一次 Rails 项目异常排查 at 2017年01月23日

    好文,说的很详细,管理员置成精华贴吧

  • 赞、学习了

  • ruby 时间区间判断 at 2015年05月23日

    between? 与 cover? 功能是一样的,我更喜欢使用 cover?,因为使用 cover? 更 ruby 些

  • 《提问的智慧》 at 2015年02月26日

    谢谢分享

  • @caozhzh 回答的很好。有谁能解释一下:rvm autolibs packages、rvm autolibs read-only、rvm autolibs disable、rvm autolibs enable 这 5 个的应用场景吗?

  • Solr 安装指南 Ubuntu 篇 at 2014年07月11日

    @dddd1919 写这个其实就是按照 Rubyer 的思路来的,上面说的 Sunspot 也是 Ruby 的 gem 包

  • 除了 custom expectations 外,我们经常会写一下 custom matcher, 比如我们会有这样的需求,每次跑 Rspec 来检测代理里面有没有特定的字符,自定义输出详细的错误。

    推荐学习资料:https://www.relishapp.com/rspec/rspec-expectations/v/2-3/docs/custom-matchers

  • 楼主,太佩服你了,加油,你必成功

  • 有关 win32ole 问题 at 2014年06月02日

    @zhurongwell @ywjno 我在 linux 下面 require 'win32ole' 直接就报 LoadError: cannot load such file -- win32ole,是不是这个标准库 (win32ole),不能在 linux 下面使用啊

  • @kgra 我在 linux 下面 require 'win32ole' 直接就报 LoadError: cannot load such file -- win32ole,是不是这个标准库 (win32ole),不能在 linux 下面使用啊

  • @wuwx @huacnlee 我想问一下为什么不一样

  • @wuwx @huacnlee 说的具体一点就是,Digest::MD5.hexdigest(ActiveRecord::Relation) 每次的结果不一样

  • @wuwx @huacnlee 为什么 ActiveRecord::Relation 每次查询出来的不一样啊?

  • @wuwx @huacnlee 上面处理有一个问题想问一下,@topics = Topic.includes(:user).page(1).reverse_order 这是一个延迟查询,@topics = Topic.includes(:user).page(params[:page]).reverse_order.all 这是真正去查询了数据了,如果页面做了片段缓存,那么 @topics = Topic.includes(:user).page(1).reverse_order 将不会查询数据,但是进行了内容的传输,没有用到本地浏览器缓存,@topics = Topic.includes(:user).page(params[:page]).reverse_order.all 也查了数据库,但是用到了本地浏览器缓存

  • 支持,非常感谢分享

  • Rails 2014 Conf 心得 at 2014年05月09日

    多谢分享

  • 感谢楼主

  • 《重构 (Ruby 版)》一书当中,提到了运用 inject 方法实现集合闭包方法。 重构前代码:

    def total_charge     result = 0     @rentals.each do |element|         result += element.charge     end     result end

    但是通过运用集合闭包方法以及注入的方法还可以进一步简化它。

    def total_charge     [email protected](0) {|sum, rental| sum + rental.charge} end

    大家应该记住 inject 这个方法,让我们的代码重构变得漂亮

  • 谢谢 @nightire

  • @xds2000 今天使用了 mock_redis 这个 gem,非常不错。

    其实我们在编写测试代码时,确实是不应该去关心 redis 的环境,这个 MockRedis gem 确实不错。

    比如 项目里面有一条语句:

    def aaa   ......   Redis.current.set('redis_key', 'abcd')   ...... end

    当我需要运用 rspec 测试该方法时,如果没有该 gem 时,我需要在测试环境把 redis 配置好,才能进行测试,当我用上这个 gem 时,就不再关心 redis 环境了,我只需要在 rspec 代码里面写上这句话:

    before :each do   redis_instance = MockRedis.new   Redis.stub(:current).and_return(redis_instance) end

    感谢楼主的分享

  • @nouse 看到这一句话,有一种想去研究的冲动

    "Sequel has restored my faith in Ruby. It's really amazing. The O/RM I've been hoping for for years." -- Sam Smoot, creator of DataMapper

    谢谢推荐

  • 可以,今天晚上有空把 https://www.coffeepowered.net/2009/01/23/mass-inserting-data-in-rails-without-killing-your-performance/ 这篇文章核心地方翻译了一下

    Rails AR 并没有很好的支持大数据量的插入,因为它并没有做什么额外处理的工作,你可以会说“只是循环创建了大量的 AR 对象,没有什么的” 是这样工作的,如果效率是我们关心的因素,那这样肯定就不是最好的选择了。 AR 提供了非常容易操作 DB 的接口,但是它并不是最快的操作。 实例化一个 AR 对象的代价是昂贵的,如果你实例化了很多 AR 对象,会加快垃圾收集器运行,这将显著影响性能。有几个方案,但是取决于你需要速度到底有多快。

    第一种:使用 transactions

    Instead of

    1000.times { Model.create(options) }

    You want:

    ActiveRecord::Base.transaction do    1000.times { Model.create(options) } end

    数据库执行所有的插入是在一个 BEGIN....COMMIT, 而不是对于每一个执行都是 BEGIN....COMMIT, 从来节省了 (90.1ms) COMMIT 的时间。

    第二种:Get down and dirty with the raw SQL

    如果你知道你的数据是有效的并且可以跳过验证,你可以通过直接生成 SQL 从而节省大量时间。 想象一下,例如,你正在运行如下 code

    1000.times {|i| Foo.create(:counter => i) }

    这将产生 1000 个 AR 对象并运行验证和生成 insert sql 语句然后插入到数据库中。你能意识到通过直接生成 sql 将提升大量性能。

    1000.times do |i|   Foo.connection.execute "INSERT INTO foos (counter) values (#{i})" end

    如果插入的值没有过滤,你有必须对输入的值使用 sanitize_sql 方法过滤,但是通过直接拼接 sql 你能意识到能提高大量性能。当然把这些 insert 语句放在一个 BEGIN....COMMIT 中,如第 1 种方案那样,会提高更高的性能。

    Foo.transaction do   1000.times do |i|     Foo.connection.execute "INSERT INTO foos (counter) values (#{i})"   end end

    第三种:大量数据一次性插入

    很多数据库都支持通过单一 sql 语句插入大量数据。如果你习惯使用它,这将是到目前为止最快的方式。

    inserts = [] TIMES.times do   inserts.push "(3.0, '2009-01-23 20:21:13', 2, 1)" end sql = "INSERT INTO user_node_scores (score, updated_at, node_id, user_id) VALUES #{inserts.join(", ")}"

    在这里没有放在一个事务里面,因为仅仅是一条单一的语句,数据库会把它放在一个事务里面的。

  • Mechanize 自动登陆使用疑问 at 2014年02月11日

    mechanize 操作 cookie 的方式为:

    hash = {:name => 'abcd', :value => '123456', :path => '/', :domain => '.qq.com'} cookie = Mechanize::Cookie.new(hash[:name], hash[:value]) cookie.domain = hash[:domain] cookie.path = hash[:path] agent.cookie_jar.add(URI.parse(url), cookie)

    通过上面代码,agent 就带上 cookie 了

    因为 mechanize 不能执行 JS,功能上确实有局限,你需要更强大的自动化操作,你可以去研究一下 selenium

  • Mechanize 自动登陆使用疑问 at 2014年02月10日

    我登录成功后,就是访问了 http://www.yyets.com/user/user/ 这个个人中心的页面,都是可以进去的啊,你访问的是什么页面啊?

  • Mechanize 自动登陆使用疑问 at 2014年02月10日

    晕哦,又错了,是 md 处理了 agent.get('http://www.yyets.com/user/user/') . save('2.html''') ,这样,你把空格去掉

  • Mechanize 自动登陆使用疑问 at 2014年02月10日

    最后一句写错了:agent.get('http://www.yyets.com/user/user/.save('2.html''')) 应该是这样,复制代码时出错了,不好意思

  • Mechanize 自动登陆使用疑问 at 2014年02月10日

    是能够登录的,代码如下:

    代码第 9 行和 第 10 行请用你的用户名和密码替换,运行下面的代码,请打开 2.html 文件查看 mechanize 版本为:2.7.1

    1 require 'mechanize' 2 agent = Mechanize.new 3 page = agent.get 'http://www.yyets.com/User/Login' 4 form = page.form_with(:id => 'loginform') 5 post_params = {} 6 form.fields.each do |field| 7 post_params[field.name] = form.field_with(:name => field.name).value 8 end 9 post_params['account'] = 'username' 10 post_params['password'] = 'password' 11 post_params['from'] = 'loginpage' 12 post_params['remember'] = 0 13 post_params['url_back'] = '' 14 pay_page = agent.post('http://www.yyets.com/User/Login/ajaxLogin', post_params) 15 agent.get('http://www.yyets.com/user/user/.save('2.html''))

    为什么这里用 agent.post -> 请打开 firefox 查看请求记录,就明白了 为什么这里需要这些参数 -> 请打开 firefox 查看请求记录,就明白了

  • 我己经申请加入,请 lz 加入