ruby-on-rails - Rails / Arel:Sélection de tous les enregistrements en tant que ActiveRecord::Relation




active-relation (4)

Essayez la relation = Model.scoped . Cela vous donnera la relation au lieu des résultats réels.

Utiliser Arel dans Rails - Je cherche un moyen de créer une ActiveRecord::Relation qui aboutit à la SELECT * FROM table , que je peux encore manipuler.

Par exemple, j'ai un modèle qui est divisé en plusieurs catégories, et je renvoie les chiffres suivants de la manière suivante:

relation = Model.where(:archived => false) # all non-archived records
record_counts = {
  :total => relation.count,
  :for_sale => relation.where(:for_sale => true).count
  :on_auction => relation.where(:on_auction => true).count
}

Cela fonctionne bien et a l'avantage de déclencher des requêtes COUNT vers MySQL, plutôt que de sélectionner les enregistrements eux-mêmes.

Cependant, je dois maintenant inclure les enregistrements archivés dans les comptes, mais relation = Model.all donne un Array , et je recherche une ActiveRecord::Relation .

La seule façon de penser à cela est model.where(model.arel_table[:id].not_eq(nil)) , qui fonctionne, mais semble légèrement absurde.

Quelqu'un peut-il nous éclairer à ce sujet?


Pour Rails 4.1 et ci-dessus: Model.all renvoie une relation (où ce n'est pas le cas auparavant)

Pour Rails 4.0: Model.where(nil)

Pour Rails 3.x: Model.scoped


Tu voudrais:

relation = Model.scoped

qui, si vous voyez quelle relation est, c'est en fait un ActiveRecord::Relation .

Comme vous pouvez le voir sur cette page:

http://api.rubyonrails.org/classes/ActiveRecord/NamedScope/ClassMethods.html#method-i-scoped

Il dit ce qui suit:

Les portées anonymes ont tendance à être utiles lors de la génération de requêtes complexes, où il est pratique de faire passer des valeurs intermédiaires (scopes) en tant qu'objets de première classe.


Il existe en fait une alternative à l'approche encombrante de l'i18n. La solution s'appelle Tr8n.

Votre code ci-dessus serait simplement:

 <%= tr("You have {num || kid}", num: 1) %>

C'est tout. Pas besoin d'extraire vos clés de votre code et de les maintenir dans des bundles de ressources, pas besoin d'implémenter des règles de pluralisation pour chaque langue. Tr8n est livré avec des règles de contexte numériques pour toutes les langues. Il est également livré avec des règles de genre, des règles de liste et des cas de langue.

La définition complète de la clé de traduction ci-dessus ressemblerait à ceci:

 <%= tr("You have {num:number || one: kid, other: kids}", num: 1) %>

Mais puisque nous voulons économiser de l'espace et du temps, num est automatiquement mappé aux règles numériques et il n'est pas nécessaire de fournir toutes les options pour les valeurs des règles. Tr8n vient avec des pluralizers et des inflectors qui feront le travail pour vous à la volée.

La traduction de votre clé en russe serait simplement:

 "У вас есть {num || ребенок, ребенка, детей}"

En passant, votre traduction serait inexacte dans les langues qui ont des règles spécifiques au genre. Par exemple, en hébreu, vous devez spécifier au moins 2 traductions pour votre exemple, car "You" serait différent en fonction du sexe de l'utilisateur. Tr8n le gère très bien. Voici une translittération des traductions hébraïques:

 "Yesh leha yeled ahad" with {context: {viewing_user: male, num: one}}
 "Yesh leha {num} yeladim" with {context: {viewing_user: male, num: other}}
 "Yesh lah yeled ahad" with {context: {viewing_user: female, num: one}}
 "Yesh lah {num} yeladim" with {context: {viewing_user: female, num: other}}

Donc, votre seule clé anglaise, dans ce cas, a besoin de 4 traductions. Toutes les traductions sont effectuées dans le contexte - vous n'avez pas à casser la phrase. Tr8n dispose d'un mécanisme permettant de mapper une clé à plusieurs traductions en fonction du langage et du contexte, le tout à la volée.

Une dernière chose. Et si vous deviez rendre la partie en gras? Ce serait simplement:

<%= tr("You have [bold: {num || kid}]", num: 1, bold: "<strong>{$0}</strong>") %>

Juste au cas où vous voudriez redéfinir votre "bold" plus tard - ce serait très facile - vous n'aurez pas besoin de parcourir tous vos fichiers YAML et de les changer - vous le faites juste au même endroit.

Pour en savoir plus, jetez un oeil ici:

https://github.com/tr8n/tr8n_rails_clientsdk

Divulgation: Je suis le développeur et le mainteneur du framework Tr8n et de toutes ses bibliothèques.







ruby-on-rails activerecord arel active-relation