0

Comment puis-je utiliser la mise à jour sur mon objet lorsque j'ai une portée par défaut qui exclut l'enregistrement que je veux mettre à jour?Comment utiliser ActiveRecord :: Base.update lorsque default_scope exclut l'enregistrement?

Par défaut Portée

class Player < ActiveRecord::Base 

    default_scope { where(imported_with_errors: false) } 

end 

Contrôleur Joueur

respond_to do |format| 
    if @player.update(player_params) # errors out at this line... 
    # ... 
    else 
    # ... 
    end 
end 

Erreur

Couldn't find Player with 'id'=34839 [WHERE [players].[imported_with_errors] = 0] 

set_player

@player = Player.unscoped.friendly.find(params[:id]) 

Stack Trace

activerecord (4.2.0) lib/active_record/relation/finder_methods.rb:336:in `raise_record_not_found_exception!' 
activerecord (4.2.0) lib/active_record/relation/finder_methods.rb:456:in `find_one' 
activerecord (4.2.0) lib/active_record/relation/finder_methods.rb:435:in `find_with_ids' 
activerecord (4.2.0) lib/active_record/relation/finder_methods.rb:71:in `find' 
app/controllers/players_controller.rb:106:in `set_player' 
activesupport (4.2.0) lib/active_support/callbacks.rb:427:in `block in make_lambda' 
activesupport (4.2.0) lib/active_support/callbacks.rb:145:in `call' 
activesupport (4.2.0) lib/active_support/callbacks.rb:145:in `block in halting_and_conditional' 
activesupport (4.2.0) lib/active_support/callbacks.rb:234:in `call' 
activesupport (4.2.0) lib/active_support/callbacks.rb:234:in `block in halting' 
activesupport (4.2.0) lib/active_support/callbacks.rb:151:in `call' 
activesupport (4.2.0) lib/active_support/callbacks.rb:151:in `block in halting_and_conditional' 
activesupport (4.2.0) lib/active_support/callbacks.rb:169:in `call' 
activesupport (4.2.0) lib/active_support/callbacks.rb:169:in `block in halting' 
activesupport (4.2.0) lib/active_support/callbacks.rb:234:in `call' 
activesupport (4.2.0) lib/active_support/callbacks.rb:234:in `block in halting' 
activesupport (4.2.0) lib/active_support/callbacks.rb:169:in `call' 
activesupport (4.2.0) lib/active_support/callbacks.rb:169:in `block in halting' 
activesupport (4.2.0) lib/active_support/callbacks.rb:169:in `call' 
activesupport (4.2.0) lib/active_support/callbacks.rb:169:in `block in halting' 
activesupport (4.2.0) lib/active_support/callbacks.rb:308:in `call' 
activesupport (4.2.0) lib/active_support/callbacks.rb:308:in `block (2 levels) in halting' 
rails-observers (0.1.2) lib/rails/observers/action_controller/caching/sweeping.rb:73:in `around' 
activesupport (4.2.0) lib/active_support/callbacks.rb:450:in `public_send' 
activesupport (4.2.0) lib/active_support/callbacks.rb:450:in `block in make_lambda' 
activesupport (4.2.0) lib/active_support/callbacks.rb:307:in `call' 
activesupport (4.2.0) lib/active_support/callbacks.rb:307:in `block in halting' 
activesupport (4.2.0) lib/active_support/callbacks.rb:151:in `call' 
activesupport (4.2.0) lib/active_support/callbacks.rb:151:in `block in halting_and_conditional' 
activesupport (4.2.0) lib/active_support/callbacks.rb:169:in `call' 
activesupport (4.2.0) lib/active_support/callbacks.rb:169:in `block in halting' 
activesupport (4.2.0) lib/active_support/callbacks.rb:92:in `call' 
activesupport (4.2.0) lib/active_support/callbacks.rb:92:in `_run_callbacks' 
activesupport (4.2.0) lib/active_support/callbacks.rb:734:in `_run_process_action_callbacks' 
activesupport (4.2.0) lib/active_support/callbacks.rb:81:in `run_callbacks' 
actionpack (4.2.0) lib/abstract_controller/callbacks.rb:19:in `process_action' 
actionpack (4.2.0) lib/action_controller/metal/rescue.rb:29:in `process_action' 
actionpack (4.2.0) lib/action_controller/metal/instrumentation.rb:31:in `block in process_action' 
activesupport (4.2.0) lib/active_support/notifications.rb:164:in `block in instrument' 
activesupport (4.2.0) lib/active_support/notifications/instrumenter.rb:20:in `instrument' 
activesupport (4.2.0) lib/active_support/notifications.rb:164:in `instrument' 
actionpack (4.2.0) lib/action_controller/metal/instrumentation.rb:30:in `process_action' 
actionpack (4.2.0) lib/action_controller/metal/params_wrapper.rb:250:in `process_action' 
activerecord (4.2.0) lib/active_record/railties/controller_runtime.rb:18:in `process_action' 
actionpack (4.2.0) lib/abstract_controller/base.rb:137:in `process' 
actionview (4.2.0) lib/action_view/rendering.rb:30:in `process' 
actionpack (4.2.0) lib/action_controller/metal.rb:195:in `dispatch' 
actionpack (4.2.0) lib/action_controller/metal/rack_delegation.rb:13:in `dispatch' 
actionpack (4.2.0) lib/action_controller/metal.rb:236:in `block in action' 
actionpack (4.2.0) lib/action_dispatch/routing/route_set.rb:73:in `call' 
actionpack (4.2.0) lib/action_dispatch/routing/route_set.rb:73:in `dispatch' 
actionpack (4.2.0) lib/action_dispatch/routing/route_set.rb:42:in `serve' 
actionpack (4.2.0) lib/action_dispatch/journey/router.rb:43:in `block in serve' 
actionpack (4.2.0) lib/action_dispatch/journey/router.rb:30:in `each' 
actionpack (4.2.0) lib/action_dispatch/journey/router.rb:30:in `serve' 
actionpack (4.2.0) lib/action_dispatch/routing/route_set.rb:802:in `call' 
rack (1.6.4) lib/rack/etag.rb:24:in `call' 
rack (1.6.4) lib/rack/conditionalget.rb:38:in `call' 
rack (1.6.4) lib/rack/head.rb:13:in `call' 
actionpack (4.2.0) lib/action_dispatch/middleware/params_parser.rb:27:in `call' 
actionpack (4.2.0) lib/action_dispatch/middleware/flash.rb:260:in `call' 
rack (1.6.4) lib/rack/session/abstract/id.rb:225:in `context' 
rack (1.6.4) lib/rack/session/abstract/id.rb:220:in `call' 
actionpack (4.2.0) lib/action_dispatch/middleware/cookies.rb:560:in `call' 
activerecord (4.2.0) lib/active_record/query_cache.rb:36:in `call' 
activerecord (4.2.0) lib/active_record/connection_adapters/abstract/connection_pool.rb:647:in `call' 
activerecord (4.2.0) lib/active_record/migration.rb:378:in `call' 
actionpack (4.2.0) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call' 
activesupport (4.2.0) lib/active_support/callbacks.rb:88:in `call' 
activesupport (4.2.0) lib/active_support/callbacks.rb:88:in `_run_callbacks' 
activesupport (4.2.0) lib/active_support/callbacks.rb:734:in `_run_call_callbacks' 
activesupport (4.2.0) lib/active_support/callbacks.rb:81:in `run_callbacks' 
actionpack (4.2.0) lib/action_dispatch/middleware/callbacks.rb:27:in `call' 
actionpack (4.2.0) lib/action_dispatch/middleware/reloader.rb:73:in `call' 
actionpack (4.2.0) lib/action_dispatch/middleware/remote_ip.rb:78:in `call' 
actionpack (4.2.0) lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call' 
web-console (2.2.1) lib/web_console/middleware.rb:31:in `call' 
actionpack (4.2.0) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call' 
railties (4.2.0) lib/rails/rack/logger.rb:38:in `call_app' 
railties (4.2.0) lib/rails/rack/logger.rb:20:in `block in call' 
activesupport (4.2.0) lib/active_support/tagged_logging.rb:68:in `block in tagged' 
activesupport (4.2.0) lib/active_support/tagged_logging.rb:26:in `tagged' 
activesupport (4.2.0) lib/active_support/tagged_logging.rb:68:in `tagged' 
railties (4.2.0) lib/rails/rack/logger.rb:20:in `call' 
actionpack (4.2.0) lib/action_dispatch/middleware/request_id.rb:21:in `call' 
rack (1.6.4) lib/rack/methodoverride.rb:22:in `call' 
rack (1.6.4) lib/rack/runtime.rb:18:in `call' 
rack (1.6.4) lib/rack/lock.rb:17:in `call' 
actionpack (4.2.0) lib/action_dispatch/middleware/static.rb:113:in `call' 
rack (1.6.4) lib/rack/sendfile.rb:113:in `call' 
railties (4.2.0) lib/rails/engine.rb:518:in `call' 
railties (4.2.0) lib/rails/application.rb:164:in `call' 
rack (1.6.4) lib/rack/lock.rb:17:in `call' 
rack (1.6.4) lib/rack/content_length.rb:15:in `call' 
rack (1.6.4) lib/rack/handler/webrick.rb:88:in `service' 
/home/daveomcd/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/webrick/httpserver.rb:138:in `service' 
/home/daveomcd/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/webrick/httpserver.rb:94:in `run' 
/home/daveomcd/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/webrick/server.rb:294:in `block in start_thread' 
+0

Pouvez-vous publier la pile complète. Juste fait une petite application avec id convivial et les portées par défaut et je n'ai pas de problèmes –

+0

@japed, bien sûr pour jeter un coup d'oeil! – daveomcd

Répondre

2

Ce sera avant cela, où vous obtenez @player mais je ne pense pas que des rails évalues ​​jusqu'à ce qu'il doit. Pour y accéder, vous pouvez simplement appeler non délimité.

@player = Player.unscoped.find(params[:id) 
+0

bien que j'ai déjà essayé ce '@player = Player.unscoped.friendly.find (params [: id])' désolé oublié de mentionner que je vais l'ajouter ci-dessus. – daveomcd

+0

Donc, en utilisant 'byebug' cette ligne que vous avez suggérée fonctionne très bien, mais quand j'appelle la méthode de mise à jour, c'est quand elle semble rendre l'erreur que j'ai mentionnée. Aussi sélectionné manuellement à partir de la base de données et l'enregistrement est là. – daveomcd

+0

Donc, j'ai découvert que je reçois l'erreur lors de l'utilisation de Carrierwave, Si je ne télécharge pas une photo de profil, cela fonctionne très bien. Donc j'essaie de découvrir le correctif pour ça. Merci – daveomcd

0
Player.unscoped.find(id) 

Renvoie un champ pour le modèle sans les champs précédemment définis.

class Post < ActiveRecord::Base 
    def self.default_scope 
    where published: true 
    end 
end 

Post.all         # Fires "SELECT * FROM posts WHERE published = true" 
Post.unscoped.all       # Fires "SELECT * FROM posts" 
Post.where(published: false).unscoped.all # Fires "SELECT * FROM posts" 
0

Dans la classe du joueur, on peut définir un nouveau champ d'application: with_errors, il sera unscope la valeur par défaut:

class Player < ActiveRecord::Base 
    default_scope { where(imported_with_errors: false) } 
    scope :with_errors, -> { unscope(where: :imported_with_errors) } 
end 

Ainsi, vous pouvez simplement l'utiliser pour trouver un joueur comme votre besoin:

Player.with_errors.find(params[:id])