好文,说的很详细,管理员置成精华贴吧
赞、学习了
between? 与 cover? 功能是一样的,我更喜欢使用 cover?,因为使用 cover? 更 ruby 些
谢谢分享
@caozhzh 回答的很好。有谁能解释一下:rvm autolibs packages、rvm autolibs read-only、rvm autolibs disable、rvm autolibs enable 这 5 个的应用场景吗?
@dddd1919 写这个其实就是按照 Rubyer 的思路来的,上面说的 Sunspot 也是 Ruby 的 gem 包
除了 custom expectations 外,我们经常会写一下 custom matcher, 比如我们会有这样的需求,每次跑 Rspec 来检测代理里面有没有特定的字符,自定义输出详细的错误。
推荐学习资料:https://www.relishapp.com/rspec/rspec-expectations/v/2-3/docs/custom-matchers
楼主,太佩服你了,加油,你必成功
@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 上面处理有一个问题想问一下,@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 也查了数据库,但是用到了本地浏览器缓存
支持,非常感谢分享
多谢分享
感谢楼主
《重构 (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 操作 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
我登录成功后,就是访问了 http://www.yyets.com/user/user/ 这个个人中心的页面,都是可以进去的啊,你访问的是什么页面啊?
晕哦,又错了,是 md 处理了 agent.get('http://www.yyets.com/user/user/') . save('2.html''') ,这样,你把空格去掉
最后一句写错了:agent.get('http://www.yyets.com/user/user/.save('2.html''')) 应该是这样,复制代码时出错了,不好意思
是能够登录的,代码如下:
代码第 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 加入