2010-10-22 9 views
1

J'essaie de choisir 5 marques distinctes parmi les voitures qui appartiennent à mes utilisateurs. Ma tentative actuelle est ci-dessous (aucune approche pour sélectionner au hasard).Rails 3 - Distinct et aléatoire

@range = @user.cars.select('DISTINCT brand_id').limit(5) 

Comment puis-je sélectionner ces cinq marques distinctes aléatoires? Merci beaucoup.

+0

Quel moteur DB utilisez-vous? (MySQL, SQLite etc?) – Swanand

+0

MySQL - bien que le select ('DISTINCT brand_id') ne fonctionne pas seul. – sscirrus

+0

La portée des voitures est-elle? – Bohdan

Répondre

0

Bien que pas très élégant, je pourrais sélectionner toutes vos marques distinctes, puis en choisir 5 au hasard. Dans ce cas, je m'attends à ce que votre liste de marques ne soit pas très grande, donc la requête initiale ne devrait pas être trop chère.

brands = @user.cars.select('DISTINCT brand_id') 
selection = 5.times.map{ Random.new.rand(0..brands.size) } # Random requires Ruby 1.9.2+ 
@range = [] 
selection.each { |rec| @range << brands[rec] } 

Ceci est le code non testé alors excuses si j'ai tromper.

+0

Il semble avoir un problème à faire DISTINCT sur @ user.cars. Il semble fonctionner directement sur un modèle mais pas sur des documents connexes. – sscirrus

+0

Je vais deviner que vous avez besoin d'un qualificateur de nom de table, par ex. Voitures DISTINCT \ '.brand_id ' – Warren

0

Le code donné dans la question choisit cinq marques de voiture appartenant à un utilisateur particulier. C'est un utilisateur assez chanceux.

Si nous supposons que vous essayez de choisir cinq marques au hasard parmi toutes les voitures appartenant à au moins un de vos utilisateurs, je pense que vous voulez quelque chose comme ceci:

Car.select("DISTINCT cars.brand_id").order("RANDOM()").joins(:user).limit(5) 

Cela devrait fonctionner si tant que Car a une relation de appartenance à l'utilisateur.

Si vous voulez vraiment limiter la portée à une seule des voitures de l'utilisateur, alors vous voulez quelque chose comme ceci:

@user.cars.select("DISTINCT cars.brand_id").order("RANDOM()").limit(5) 

Pour ce que ça vaut, dans une base MySQL dont vous avez besoin « pour (RAND()) » plutôt que "order (RANDOM())".

0

Cela vous aide la cueillette des enregistrements distincts

@range = @user.cars.select('brand_id').uniq.limit(5)