2


Il y a un rubis sur le code de railsRequête indépendante ActiveRecord dans ActiveRecord :: contexte Relation

class User < ActiveRecord::Base 
    def self.all_users_count 
    User.all 
    end 
end 

User.all_users_count
retours, par exemple,

User.limit(5).all_users_count
il Retournons maintenant en raison du contexte ActiveRecord :: Relation, malgré le nom de wrroute classe User.all au lieu simple, all
(.to_sql montrent que la requête contient toujours limit ou where id ou d'autres choses dans d'autres cas)

Alors, comment puis-je faire des requêtes AR contexte indépendant à l'intérieur des méthodes de modèle? comme User.all et autres?

Merci!

Ps. Ou peut-être mon code a une erreur ou quelque chose comme ça, et en fait User.all dans toutes les méthodes et le contexte doit toujours retourner le nombre de lignes correctes de cette table modèle

Répondre

1

Ceci est très étrange et inattendu (malheureusement, je ne peux pas le confirmer, parce que mon ordinateur s'est écrasé et n'a pas de projets de rails sous la main).

Je me attends

User.all 

pour créer un nouveau champ (ou comme vous l'appelez - contexte)

Essayez de travailler autour de cela avec

User.unscoped.all 

Edit:

Je l'ai essayé sur mon projet et sur le repo des rails propres, et les résultats sont cohérents.

Et après avoir réfléchi un peu - ce n'est peut-être même pas un problème - je pense que votre approche pourrait être défectueuse.

Dans quel scénario enchaîneriez-vous User.limit(2).all_users_count? Je ne peux pas penser à tout. Parce que soit vous avez besoin tous les utilisateurs cound, et que vous appelez User.all_usert_count (ou tout simplement User.count)

... ou vous avez besoin quelque chose d'autre et que vous appelez User.limit(2).where(...) - il ne sert à rien d'appeler all_users_count dans cette chaîne, est-il?

Et, quand on y pense, c'est logique. Imaginez que vous aviez une méthode différente comme count_retired, que voulez-vous attendre d'un tel appel:

User.limit(2).count_retired?

Nombre d'utilisateurs retraités ne dépassant pas 2, ou le nombre de retraités dans le système? Je m'attendrais à l'ancien.

Je pense donc que l'une des deux possibilités:

  • soit votre mise en œuvre mal, et crier le faire d'une manière différente (comme décrit ci-dessus dans la section d'édition)
  • ou si vous avez un peu plus problème complexe, mais vous avez fait bouillir vos exemples jusqu'à un point où ils n'ont plus beaucoup de sens (s'il vous plaît faites une autre question s'il vous plaît, et s'il vous plait, envoyez-moi un commentaire avec un lien si vous le intéressant)
+0

** Oui, ça marche, merci! ** Je recherche "contex t "et" portée "et autre chose et ne trouve rien sur ma situation. Je me suis douté qu'il existe une méthode similaire, mais il est difficile de formuler ce problème pour Google. Ps. Oui, je suis d'accord, c'est un comportement inattendu, mais c'est ... au moins dans mon cas – dmitryck

+0

UPD. 'unscoped' fonctionne bien dans certains cas simples, mais quand la requête est plus grande et beaucoup de méthodes s'appliquent sur le modèle d'autres gemmes (comme l'arbre de fermeture) - c'est encore une condition supplémentaire à la requête sql sommaire .. ok, merci beaucoup match! – dmitryck

+0

C'est bizarre et confus, je vais certainement enquêter là-dessus quand j'ai un projet de rails sur lequel travailler. – meta