web-dev-qa-db-fra.com

Fusionner des tableaux dans Ruby / Rails

Comment puis-je fusionner deux tableaux? Quelque chose comme ça:

@movie = Movie.first()
@options = Movie.order("RANDOM()").first(3).merge(@movie)

Mais ça ne marche pas.

Dans @options J'ai besoin d'un tableau à quatre éléments comprenant @movie.

15
Croaton

Comme ça?

⚡️ irb
2.2.2 :001 > [1,2,3] + [4,5,6]
 => [1, 2, 3, 4, 5, 6] 

Mais vous n'avez pas 2 tableaux.

Vous pourriez faire quelque chose comme:

@movie = Movie.first()
@options = Movie.order("RANDOM()").first(3).to_a << @movie
38
Nick Veys

Cette question comporte deux parties:

  1. Comment "fusionner deux tableaux"? Utilisez simplement le + méthode:

    [1,2,3] + [2,3,4]
    => [1, 2, 3, 2, 3, 4]
    
  2. Comment faire ce que tu veux? (Ce qui, en fin de compte, ne fusionne pas deux tableaux.) Commençons par résoudre ce problème:

    @movie est une instance de votre modèle Movie, que vous pouvez vérifier avec @movie.class.name.

    @options est un Array, que vous pouvez vérifier avec @options.class.name.

    Tout ce que vous devez savoir maintenant, c'est comment ajouter un nouvel élément à un tableau (c'est-à-dire ajouter votre @movie élément à votre @options tableau)

    Pour ce faire, utilisez la double pelle:

    @options << @movie
    

    c'est essentiellement la même chose que quelque chose comme:

    [1,2,3] << 4
    => [1,2,3,4]
    
7
joshua.paling

@movie n'est pas un tableau dans votre exemple, c'est juste une seule instance d'un film. Cela devrait résoudre votre problème:

@options << @movie
3
spickermann

Pour fusionner (faire l'union de) tableaux:

[1, 2, 3].union([2, 4, 6]) #=> [1, 2, 3, 4, 6] (FROM Ruby 2.6)
[1, 2, 3] | [2, 4, 6] #=> [1, 2, 3, 4, 6]

Pour concaténer des tableaux:

[1, 2, 3].concat([2, 4, 6]) #=> [1, 2, 3, 2, 4, 6] (FROM Ruby 2.6)
[1, 2, 3] + [2, 4, 6] #=> [1, 2, 3, 2, 4, 6]

Pour ajouter un élément à un tableau:

[1, 2, 3] << 4 # => [1, 2, 3, 4]

Mais il semble que vous n'ayez pas de tableaux, mais des enregistrements actifs. Vous pouvez le convertir en tableau avec to_a, mais vous pouvez aussi faire directement:

Movie.order("RANDOM()").first(3) + [@movie]

qui renvoie le tableau que vous souhaitez.

Eh bien, si vous avez un élément à fusionner dans un tableau, vous pouvez utiliser <<:

Eg: array = ["a", "b", "c"],  element = "d"
array << element 
=> ["a", "b", "c", "d"]

Ou si vous avez deux tableaux et souhaitez des doublons, utilisez += ou simplement + en fonction de vos besoins en matière de mutabilité:

Eg: array_1 = [1, 2], array_2 = [2, 3]
array_1 += array_2
=> [1, 2, 2, 3]

Ou si vous avez deux tableaux et que vous souhaitez négliger les doublons, utilisez |= ou simplement |:

Eg: array_1 = [1, 2], array_2 = [2, 3]
array_1 |= array_2
=> [1, 2, 3] 
1
Ayman Hussain