Java 的多态对应的是 duck typing Module 应该像 Java8 的胖接口(是这么叫?)
个人非常恶心这种面试题,都是捡大公司剩下的..
找到了,是 automatic_inverse_of
搞的鬼。
这里判断了是否开启 automatic_inverse_of
def automatic_inverse_of
if can_find_inverse_of_automatically?(self)
inverse_name = ActiveSupport::Inflector.underscore(active_record.name).to_sym
begin
reflection = klass._reflect_on_association(inverse_name)
rescue NameError
# Give up: we couldn't compute the klass type so we won't be able
# to find any associations either.
reflection = false
end
if valid_inverse_reflection?(reflection)
return inverse_name
end
end
false
end
然后这里返回了 nverse_name
结果导致 rails 执行了 set_inverse_instance
#9 楼 @so_zengtao no
#4 楼 @hz_qiuyuanxin 4.0 -> 4.1rc -> 4.1.1
ie css hack
虽然不明白这个查询的意图,但是我这里是会重新查询一次的
irb(main):010:0> a = ArticleContent.select(:article_id).first.article
ArticleContent Load (0.8ms) SELECT "article_contents"."article_id" FROM "article_contents" ORDER BY "article_contents"."id" ASC LIMIT 1
Article Load (0.9ms) SELECT "articles".* FROM "articles" WHERE "articles"."id" = $1 LIMIT 1 [["id", 1]]
=> #<Article id: 1, user_id: 1, title: "12", slug: "12", created_at: "2014-05-26 08:26:05", updated_at: "2014-05-26 08:32:10", category_id: 1, published_at: "2014-05-26 08:26:00">
irb(main):011:0> a.content
ArticleContent Load (1.0ms) SELECT "article_contents".* FROM "article_contents" WHERE "article_contents"."article_id" = $1 LIMIT 1 [["article_id", 1]]
=> #<ArticleContent id: 2, article_id: 1, body: "<p>33</p><p><img src=\"/uploads/attachment/file/1/c...", created_at: "2014-05-26 08:43:53", updated_at: "2014-05-26 08:43:53">
irb(main):012:0> Rails.version
=> "4.1.1"
irb(main):013:0>
#6 楼 @so_zengtao token 只是拿来校验是否过期,当 token + id 给了服务器,服务器会到一张专门记 token 的表查询是否存在,不存在则忽略 id 直接清空 session,反之根据 id 拿到 user 对象
表吧。文件并发写还要解决互斥问题
不是. rails 常用的 devise 没看过源码不清楚。sorcery 和 @rei 在 campo 里自己写的登录逻辑都是记录 user_id。每次请求会自动用 user_id 查询 user 表。
instance_variables.each do |var|
self.class.class_eval do
attr_reader var[1..-1]
end
end
放到 initialize
方法最后,只针对单个方法中的实例变量,因为实例变量声明的位置不固定。
另外,要这样做之前请确定你已经知道 ocp 原则和代码的用处,产品代码这么玩会被人问候的
https://github.com/puma/puma#restart
cat puma.pid | xargs kill -SIGUSR2
#5 楼 @zj0713001 用乐观锁是否还是会有楼主提到的问题?mysql 给范围查询做了快照,版本信息是否也进去快照了?
这样的描述别说高人,神仙也救不了
Enumerable#each
只要 mixin Enumerable
并实现 each
方法,就可以免费得到其余的 22 个方法。
Implementing Enumerable: Write One Method, Get 22 Free
class MultiArray
include Enumerable
def initialize(*arrays)
@arrays = arrays
end
def each
@arrays.each { |a| a.each { |x| yield x } }
end
end
ma = MultiArray.new([1, 2], [3], [4])
ma.collect # => [1, 2, 3, 4]
ma.detect { |x| x > 3 } # => 4
ma.map { |x| x ** 2 } # => [1, 4, 9, 16]
ma.each_with_index { |x, i| puts "Element #{i} is #{x}" }
# Element 0 is 1
# Element 1 is 2
# Element 2 is 3
# Element 3 is 4
这里是详细讲解了 Enumerable::Lazy
,有兴趣的话可以看一下:http://railsware.com/blog/2012/03/13/ruby-2-0-enumerablelazy
不。Ruby 开始设计使用 block 并没有用到延迟迭代,这个好像到了 2.0 才引入。 这个设计初衷应该是向函数式靠拢:程序员不必关注如何迭代,而是如何处理逻辑(循环体)。
2.0 引入了 Enumerable::Lazy
,让链式的迭代处理延延后。(PS: Ruby 的迭代都是基于 each 方法的)
a = [1,2,3,4,2,5].lazy.map { |x| x * 10 }.select { |x| x > 30 } #=> 虽然同时出现 map和select,但each 一次也不会执行,程序返回迭代器
a.to_a #=> [40, 50], #=> 这里才开始执行代码,而且只执行一次 each
在 github 搜了一下 有些是用 js 写的解释器在前端直接将代码转换成 js 来执行。比如 ruby 到 js 可以用 Opal