Rails 版本是否大于 4?
创建线程时加入一个时间间隔,比如每秒创建一个。
有个 Gem 也许有用,https://github.com/grosser/parallel
在 Linux 上用locale
命令检查一下系统编码:
> locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE=en_US.UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
很可能系统编码不是 UTF-8,设置一下应该就好了。
has_many
是一个类方法。你调用这个方法的时候,它定义了一系列新方法来实现其功能。简单的说,这个方法类似于这样:
class ActiveRecord::Base
def has_many(name, options = {})
define_method name do
# return the association
...
end
end
end
因此,你以相同的名字两次调用has_many
时,第二次调用时定义的方法就把之前定义的方法覆盖掉了。
也许你只能用不同的名字,比如:
class User < ActiveRecord::Base
has_many :user_appointments
has_many :store_appointments, foreign_key: 'store_id'
end
用 helper 消灭多行代码。
不会是运行在 development mode 吧?
对于返回 10 的斐波那契数这样的请求,golang 的实现能处理 3 万~5 万次请求/秒,而 sinatra 的实现则只能处理 600 多次请求/秒。差距真是不小呀。详见 Node Express vs Python Flask vs Go vs Sparkjava vs Ruby Sinatra.
好像只要你在源代码里改动一个字符,Nanobox 都要重新 build container, 恐怕很多人没耐心等着这个。在开发环境中使用 Docker,我觉得还是直接 mount 一个 folder 比较好。
我在开发环境中用 Docker 有一段时间了,感觉最大的好处就是能够更快的搭建开发环境,比如,pull 一个 MySQL 的 image,往往比安装配置 MySQL 更快,就是你有 Chef 之类的工具安装配置 MySQL。
1.8 到 1.9 有很大的变化,有些改动导致代码不兼容,而且 1.8.6 都已经不再维护了。1.9 到 2.0 就没有兼容性问题了,只是不断增加新功能而已。 还是硬着头皮读英文吧。读一本书,同时学两种语言,不是也挺好的么。
应该是写在 database.yml 中的:
development:
adapter: mysql
encoding: unicode
...
不知道这个是不是有关:
config.active_support.time_precision
sets the precision of JSON encoded time values. Defaults to 3
.
可以看一下这篇文章,Ruby Concurrency and Parallelism: A Practical Tutorial,从概念到实现都讲得很清楚。
"'http://XXX/default.png'}"
不属于 Model,属于 View,因此,写到 helpers 里更合适,或者使用 decoretors,如draper.
web-console 能够捕获是因为造成异常的源代码在其他文件中。假设有如下代码:
a.rb
bad code
b.rb
begin
require "./a"
rescue Exception => e
puts e.inspect
end
ruby b.rb
将打印出 SyntaxError。
问题是不是也可以这样描述:对每个用户 coins 最多的 Transfer 排序,取出前 100 的 Transfer(用户)?
首先,我不建议使用 raw SQL 做查询,最好使用scope
,以便日后的代码重用。
比如,在 Transfer 中定义这样的scope
:
class Transfer < ActiveRecord::Base
scope :max_coins, -> { select("max(coins) as max_coins") }
end
然后可以构造这样的查询:
User.joins(: transfers).merge(Transfer.max_coins).group("users.id").order("max_coins desc").limit(100).select("users.id")
试试看能不能得到你想要的结果。
start_date = @options.date
的意思是定义一个 local variable,然后赋值给它,而不会调用start_date=
。正确的写法是self.start_date = @options.date
。
另外,不必为 accessors 写方法,查一下怎么用attr_accessor
。
是不是因为"0" > 0
抛出异常了?
应该不需要 middleware,可能只是配置的问题,比如 config/database.yml 里面的encoding
,mysql 里表的编码等。如果从浏览器到数据库的编码都是utf-8
,任何地方都不需要转码。
可以通过Pessimistic Locking来避免ActiveRecord::RecordNotUnique
.
这张图的标题是“厨余、可回收和其他”?
应该是很多时间花费在载入 Rails 上了。试试这个,passenger_pre_start.
是不是可以在第一次调用时请求真实的 API,然后把数据缓存起来,之后的请求就可以一直使用被缓存的数据
VCR 默认的工作方式就是这样的,也许你只需要删掉这行:WebMock.disable_net_connect!(allow_localhost: true)
.
有意思,分明是 map,为什么叫做 reducer?
[1, 2, 3, 4].map {|partial| partial + 1}.map {|partial| partial * 2}
Ruby on Rails 在运行速度或性能上对其他语言少有优势。大家选择它是因为开发速度快。经常看到有人说,你用 Ruby on Rails 做出产品来,当你的用户足够多,以至于 Rails 成为瓶颈时,你肯定有足够的资源找人用性能更好的语言改写。
再讲一下 closure 就全面了。
the GIL did, in fact, make MRI's native C method implementations atomic
MRI 原生的 C 语言编写的函数都是线程安全的。参考原文。
而File.write
的实现是 C 函数rb_io_s_write
, 因此,File.write
应该是线程安全的。
查文档,看看where
, limit
和order
都是什么意思就明白了。