L'une des choses que j'aime vraiment dans Active Record est ses étendues nommées et sa capacité à enchaîner des oscilloscopes pour créer des requêtes expressives.Comment créer des étendues composables pour des tableaux simples Ruby
Quelle serait une manière similaire de réaliser cela avec des Ruby Enumerables/Arrays, de manière idéale sans utiliser de patchs de type singulier ou Array de manière dangereuse?
Par exemple:
### ActiveRecord Model
class User < ActiveRecord::Base
scope :customers, -> { where(:role => 'customer') }
scope :speaking, ->(lang) { where(:language => lang) }
end
# querying
User.customers.language('English') # all English customers
### Plain-Ruby Array
module User
class << self
def customers
users.select { |u| u[:role] == 'customer' }
end
def speaking(lang)
users.select { |u| u[:language] == lang }
end
private
def users
[
{:name => 'John', :language => 'English', :role => 'customer'},
{:name => 'Jean', :language => 'French', :role => 'customer'},
{:name => 'Hans', :language => 'German', :role => 'user'},
{:name => 'Max', :language => 'English', :role => 'user'}
]
end
end
end
User.customers # all customers
User.language('English') # all English speakers
# how do I achieve something similar to User.customers.language('English') ...?
Je sais que je peux construire une méthode customers_with_language
à l'intérieur du module, mais je suis à la recherche d'une manière générale pour résoudre ce avec un certain nombre de « champs ».
Merci Uri. Il semble soigné, mais ne gère que la sélection des propriétés. Je cherche quelque chose de plus général/composable/fonctionnel/expressif, je l'espère. Je peux donc faire des choses comme tous les clients avec un «j» dans leur nom qui ne parle pas anglais ... (Idéalement, tout ce que je peux faire avec une portée ActiveRecord, opérer uniquement sur des tableaux). Est-ce que ça fait du sens? – gingerlime
@gingerlime - ajouté une solution plus élaborée. Vous pouvez utiliser ce modèle pour rendre votre solution encore plus élaborée. –
Ça a l'air génial, Uri! Merci beaucoup. – gingerlime