为什么在范围上使用合并方法不再适用于Rails 3.1?
问题描述:
我偶然发现了约on Rails的范围精彩的文章3+:http://edgerails.info/articles/what-s-new-in-edge-rails/2010/02/23/the-skinny-on-scopes-formerly-named-scope/index.html为什么在范围上使用合并方法不再适用于Rails 3.1?
您可以阅读那里(在“疯狂城市”一节),它可能合并来自不同的模型范围如下:
class User < ActiveRecord::Base
scope :published, lambda {
joins(:posts).group("users.id") & Post.published
}
end
正如预期其工作,并允许你做:
User.published.to_sql
#=> SELECT users.* FROM "users"
# INNER JOIN "posts" ON "posts"."author_id" = "users"."id"
# WHERE (posts.published_at IS NOT NULL AND posts.published_at <= '2010-02-27 02:55:45.063181')
# GROUP BY users.id
我试过这个方法在我的Rails 3.1的项目,显然它不工作了。
因此,我克隆了文章的Rails 3.0.0-beta1项目,我的眼睛看到这些家伙没有说谎,而且事情正在按照他们的方式工作。
然后我3.1'ed起来,现在我得到:
ruby-1.9.2-p290 :003 > User.published.to_sql
User Load (0.3ms) SELECT "users".* FROM "users" INNER JOIN "posts" ON "posts"."author_id" = "users"."id" GROUP BY users.id
Post Load (0.2ms) SELECT "posts".* FROM "posts" WHERE (posts.published_at IS NOT NULL AND posts.published_at <= '2011-10-05 11:45:00.512231')
User Load (0.1ms) SELECT "users".* FROM "users"
NoMethodError: undefined method `to_sql' for []:Array
from (irb):3
from /home/jerefrer/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.1.0/lib/rails/commands/console.rb:45:in `start'
from /home/jerefrer/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.1.0/lib/rails/commands/console.rb:8:in `start'
from /home/jerefrer/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.1.0/lib/rails/commands.rb:40:in `<top (required)>'
from script/rails:9:in `require'
from script/rails:9:in `<main>'
==>不工作了。
这让我很难过,因为范围合并非常棒,现在我不能像我想要的那样干。
你知道:
- 什么在两个版本之间发生了什么?
- 还有其他方法可以做到吗?
答
&
方法看起来不再像它的工作(太糟糕了,我发现语法很整齐)。你可以用ActiveRecord::Relation#merge
替换为:
class User < ActiveRecord::Base
scope :published, lambda {
joins(:posts).group("users.id").merge(Post.published)
}
end
编辑
它看起来像它不会回来,在轨道3.0.10尝试它给出了一个弃用警告:
DEPRECATION WARNING: Using & to merge relations has been deprecated and will be removed in Rails 3.1. Please use the relation's merge method, instead.
以下是承诺弃用它,以防某人感兴趣:https://github.com/rails/rails/commit/66003f596452aba927312c4218dfc8d408166d54
现在它回到主分支:https://github.com /rails/rails/blob/24cc9e5b4f9b729f02d2e0b56265032d08933a41/activerecord/lib/active_record/relation/spawn_methods.rb#L7 – charlysisto
@charlysisto这个文件在v3.1.0和master之间没有改变,你确定它是正确的吗? –
你是对的,混淆了某种方式 – charlysisto