2011-10-05 28 views
11

我偶然發現了約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>' 

==>不工作了。

這讓我很難過,因爲範圍合併非常棒,現在我不能像我想要的那樣幹。

你知道:

  • 什麼在兩個版本之間發生了什麼?
  • 還有其他方法可以做到嗎?

回答

17

&方法看起來不再像它的工作(太糟糕了,我發現語法很整齊)。你可以用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

+1

現在它回到主分支:https://github.com /rails/rails/blob/24cc9e5b4f9b729f02d2e0b56265032d08933a41/activerecord/lib/active_record/relation/spawn_methods.rb#L7 – charlysisto

+1

@charlysisto這個文件在v3.1.0和master之間沒有改變,你確定它是正確的嗎? –

+0

你是對的,混淆了某種方式 – charlysisto

相關問題