2011-10-05 9 views
11

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?

Respuesta

17

El método & parece que ya no funciona (lástima, encontré que la sintaxis era buena). Puede reemplazarlo con ActiveRecord::Relation#merge:

class User < ActiveRecord::Base 

    scope :published, lambda { 
    joins(:posts).group("users.id").merge(Post.published) 
    } 
end 

Editar

Y parece que no va a estar de vuelta, tratando en los carriles 3.0.10 da un aviso de desaprobación:

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. 

Aquí está el commit desaprobándolo, en caso de que alguien esté interesado: https://github.com/rails/rails/commit/66003f596452aba927312c4218dfc8d408166d54

+1

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

+1

@charlysisto Este archivo no ha cambiado entre v3.1.0 y master, ¿estás seguro de que es el correcto? –

+0

tienes razón, se confundió de alguna manera – charlysisto

Cuestiones relacionadas