Я наткнулся на замечательную статью о облаках на Rails 3+: http://edgerails.info/articles/what-s-new-in-edge-rails/2010/02/23/the-skinny-on-scopes-formerly-named-scope/index.html
Вы можете прочитать там (в разделе "Сумасшедший город" ), что можно объединить области из разных моделей, например:
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, увидел на моих глазах, что ребята не лгут, и все работает так, как они говорят.
Затем я включил его, и теперь я получаю:
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>'
== > Больше не работает.
И это меня огорчает, потому что слияние областей было потрясающим, и теперь я не могу быть таким СУХИМ, как хочу.
Знаете ли вы:
- Что произошло между двумя версиями?
- Любой другой способ сделать то же самое?