lft 和 rgt 可以确定后代和祖先的范围
对于 2 来说 lft 是 2,rgt 是 11,那所有 lft 在 2-11 之间的都是 2 的后代 对于 8 来说 lft 是 8,rgt 是 9,那 lft <= 8 且 rgt >= 9 的 即 7,2,1 是它的祖先
单纯的用 parent_id 一个字断做树形结构,查询不便,oracle 有 connect by...start with...用法可以查,其他的好像要不然在数据库中存储过程或函数来实现
纯吐槽,专业点啊,至少留个联系方式
205 个飘过
跪了。。
有没有人通过 AppCode,好不好用?
支持
有一个想法,不过好像又麻烦了
class LazyProc
def initialize(_proc, *args)
@proc = _proc
@args = args
end
def call
@proc.call(*@args)
end
end
def specs_loop
db_specs.map do |label, options|
yield(LazyProc.new(method(:build_db).to_proc, label , options))
end
end
if concurrent?
specs_loop { |lp| Thread.new { lp.call } }.map(&:value)
else
specs_loop { |lp| lp.call }
end
根据你在http://ruby-china.org/topics/8347里问题
个人感觉你把实体的具体化了到 java 的 Entity 上,其实做 rails 开发,或者说其他开发都是以需求分析,设计为先的,在设计时你说的实体并不需要以某种特定技术作为背景,可以仅仅只是业务模型或者领域模型。然后用你熟悉的任何工具来描述,比如 UML。
在你用 java 和 hibernate 时,是通注解和属性的定义来生成的数据库表,实际上 hibernate 也是双向的,也可以通过数据库表生成 Entity。
在 ruby 和 rails 里,更常用的是通过 migration 来管理数据库表,rails 会根据数据库表的字段来给 model 加上属性,不需要在 model 去写属性,更加不用一大堆 getter,setter。
所以你的转换是的是从把业务模型 (实体)具化成 java 的 Entity 转换到把业务模型 (实体)具化成 active_record 的 model(通过 migration)
#8 楼 @zacker330 为什么不尝试转变你的思维,如果你一直用 hibrnate/jpa 的思想来用 active_record,以后只会越来越困难。比如假设你以前用 struts2 或 spring mvc,你习惯用注解来配置路由,但是 rails 就是写 routes.rb,尝试去理解和转换你的思想
这样的 gem 不知道,但是自己实现一个简化版也很容易。
这样吗?
class Build
def add_service(service)
p "add service #{service}"
end
end
def build_after(server, &block)
Build.new.instance_eval(&block) if block_given?
end
build_after :some_server do
add_service :my_service
end
goodie
不错 支持
我是这样试的
我在 rails3 里,development.rb 里写config.threadsafe!
然后bundle exec thin start --thread
得到 thin 的 pid,top -pid thin_pid
终端里 repeat 10 (curl localhost:3000)
看到#TH 从 2 变成了 22,应该是开启了 (Mac 下的 top)
P.S. rails s
不行
没错,有时候不够自信,不敢提交 patch,我要多努力。
刚买 好用
54RMB 不贵啊
STDIN.gets
在用户输入后最后会有换行符,把换行符去掉
http://www.ruby-doc.org/core-1.9.3/String.html#method-i-chop
Returns a new String with the last character removed. If the string ends with \r\n, both characters are removed. Applying chop to an empty string returns an empty string. String#chomp is often a safer alternative, as it leaves the string unchanged if it doesn’t end in a record separator.
#6 楼 @Rei 还是有稍许不一样的,不一样在于你创建对象的时机
class Fruit
def kind=(k)
@kind = k
end
end
apple = Fruit.new
apple.kind = 'apple'
#p apple.kind => undefined method `kind'
p apple.inspect
class Fruit
def kind
@kind
end
end
orange = Fruit.new
orange.kind = 'orange'
p orange.kind
p orange.inspect
class Fruit
def inspect
"a fruit of the #{@kind} variety"
end
end
banana = Fruit.new
banana.kind = 'banana'
p banana.kind
p banana.inspect
你找错源码了,你用的 stub 是创建 Mock 对象的,你看的源码是 method_stub。你关注的地方的相关源码如下:
https://github.com/rspec/rspec-mocks/blob/master/lib/rspec/mocks/example_methods.rb#L40-L42
def stub(*args)
declare_double('Stub', *args)
end
一路跟踪到这里 https://github.com/rspec/rspec-mocks/blob/master/lib/rspec/mocks/test_double.rb#L22-L26
# Creates a new test double with a `name` (that will be used in error
# messages only)
def initialize(name=nil, stubs_and_options={})
__initialize_as_test_double(name, stubs_and_options)
end
以及这里 https://github.com/rspec/rspec-mocks/blob/master/lib/rspec/mocks/test_double.rb#L55-L64
def __initialize_as_test_double(name=nil, stubs_and_options={})
if name.is_a?(Hash) && stubs_and_options.empty?
stubs_and_options = name
@name = nil
else
@name = name
end
@options = extract_options(stubs_and_options)
assign_stubs(stubs_and_options)
end
具体只有 inspect 用到 https://github.com/rspec/rspec-mocks/blob/master/lib/rspec/mocks/test_double.rb#L37-L39
def inspect
"#<#{self.class}:#{sprintf '0x%x', self.object_id} @name=#{@name.inspect}>"
end
说白了,就是给个名字,错误显示里看得清楚点
阿里旺旺是属于 etao 的 0.0
考验 github 的时候到了
实际上是 pushState 和 replaceState https://developer.mozilla.org/en-US/docs/DOM/Manipulating_the_browser_history
pjax 和 turbolinks 都是基于这个来实现的