me topé con un maravilloso artículo sobre los ámbitos en los carriles 3+: http://edgerails.info/articles/what-s-new-in-edge-rails/2010/02/23/the-skinny-on-scopes-formerly-named-scope/index.html¿Por qué usar el método de fusión con ámbitos ya no funciona en Rails 3.1?
Usted puede leer allí (en la sección 'Crazy Town') que es posible fusionar los ámbitos de diferentes modelos de esta manera:
class User < ActiveRecord::Base
scope :published, lambda {
joins(:posts).group("users.id") & Post.published
}
end
el cual funciona como se esperaba, y le permite hacer:
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
probé este enfoque en mis Rails 3.1 proyecto y al parecer ya no son eficaces.
Así que cloné el proyecto Rails 3.0.0-beta1 del artículo, vi por los ojos que los muchachos no mienten y las cosas funcionan de la forma en que cuentan.
Entonces 3.1'ed hacia arriba, y ahora me sale:
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>'
==> ya no funciona.
Y eso me entristece, porque la fusión de ámbitos fue increíble y ahora no puedo ser tan SECO como quiero.
¿Sabe:
- lo que pasó entre las dos versiones?
- ¿Alguna otra forma de hacer lo mismo?
Y ahora está de vuelta en la rama principal: https://github.com /rails/rails/blob/24cc9e5b4f9b729f02d2e0b56265032d08933a41/activerecord/lib/active_record/relation/spawn_methods.rb#L7 – charlysisto
@charlysisto Este archivo no ha cambiado entre v3.1.0 y master, ¿estás seguro de que es el correcto? –
tienes razón, se confundió de alguna manera – charlysisto