2016-10-24 1 views
0

J'ai à mon avis duel.duelers.last, qui est supposé saisir le dueler avec le dernier id dans le duel, mais à la place si un duel met à jour un attribut alors ce dueler devient dernier indépendamment de son ordre dans id?Comment obtenir .last objet selon .id?

Comment puis-je récupérer le dernier dueler basé sur id?

pry(main)> Duel.last.duelers 
=> [#<Dueler:0x007fa718513530 
    id: 310, # This is Duel.last.duelers.last but is listed first here 
    user_id: 2, 
    challenge_id: 398, 
    duel_id: 186, 
#<Dueler:0x007fa718513288 
    id: 309, # This is Duel.last.duelers.first but is listed last here because it was most recently updated 
    user_id: 114, 
    challenge_id: 410, 
    duel_id: 186, 
pry(main)> Duel.last.duelers.last 
id: 310, 
user_id: 2, 
challenge_id: 398, 
duel_id: 186, 
pry(main)> Duel.last.duelers.first 
id: 309, 
user_id: 114, 
challenge_id: 410, 
duel_id: 186, 
+0

'' Dueler n'a pas 'colonne updated_at'? Si c'est le cas, alors probablement créer une portée dessus devrait aider. – Surya

+0

@Surya 'scope' semble soigné –

Répondre

2

vous voulez saisir le dernier duelliste basé sur id,

Peu importe la colonne que vous mettez à jour la dernière dans votre table, la requête de base sera commandé par duelers_id desc

Rails ordre par défaut:

Dans les rails s'il n'y a pas de commande spécifiée par défaut, ils seront triés selon la façon dont la base de données les renvoie. Usually this is by ID or insert order. La colonne created_at/updated_at est seulement là si vous l'indiquez dans vos migrations, donc cela n'aurait pas de sens d'être la colonne par défaut.

Voici un exemple de requête que j'ai faite pour vous.

Duel.last.duelers.last 

Duel Load (0.5ms) SELECT `duels`.* FROM `duels` ORDER BY `duels`.`id` DESC LIMIT 1 

Dueler Load (37.3ms) SELECT `duelers`.* FROM `duelers` WHERE `duelers`.`duel_id` = 1 ORDER BY `duelers`.`id` DESC LIMIT 1 

Cette requête charge d'abord le duel respectif et obtient alors le dernier duelliste de cet ordre duel par dueler_id desc.

Vérifiez la requête,

SELECT duellistes .* FROM duellistes WHERE duellistes . duel_id = 1 ORDER BY duellistes . id DESC LIMIT 1

il toujours par ordre id desc à moins que vous donner un champ d'application par défaut.

Dans votre question, il obtient les résultats dans l'ordre qui est l'ordre décroissant de Id

+0

@ AnthonyGalli.com, avez-vous vérifié cela? – Sravan

1

Vous pouvez

Duel.last.duelers.order(id: :desc).first 

Ou

Duel.last.duelers.order(created_at: :desc).first 

Hope this helps!

+0

ordre par' id' semble mieux que 'created_at' –

+0

@Deepak: Pourquoi? La seule chose qui est vraiment garantie à propos de 'id', c'est qu'ils sont uniques. Il est généralement préférable d'être explicite sur la commande que vous voulez afin que les horodatages soient meilleurs. –