web-dev-qa-db-ja.com

Ruby / Railsで配列をマージする

2つのアレイをマージするにはどうすればよいですか?このようなもの:

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

しかし、それは機能しません。

@optionsでは、@movieを含む4つの要素を持つ配列が必要です。

15
Croaton

このような?

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

ただし、2つの配列はありません。

次のようなことができます:

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

この質問には2つの部分があります。

  1. 「2つの配列をマージする」方法+メソッドを使用するだけです:

    [1,2,3] + [2,3,4]
    => [1, 2, 3, 2, 3, 4]
    
  2. あなたがしたいことをする方法は? (結局のところ、2つの配列をマージするわけではありません。)最初にその問題を分析しましょう。

    @movieMovieモデルのインスタンスであり、@movie.class.nameで確認できます。

    @optionsArrayであり、@options.class.nameで確認できます。

    ここで知っておく必要があるのは、配列に新しいアイテムを追加する方法です(つまり、@movieアイテムを@options配列に追加する)

    ダブルシャベルを使用してそれを行います。

    @options << @movie
    

    これは基本的に次のようなものと同じです:

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

@movieはあなたの例の配列ではなく、映画のただ一つのインスタンスです。これで問題が解決するはずです。

@options << @movie
3
spickermann

配列をマージ(結合)するには:

[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]

配列を連結するには:

[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]

配列に要素を追加するには:

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

ただし、配列はなく、アクティブなレコードがあるようです。 to_aで配列に変換できますが、直接行うこともできます:

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

必要な配列を返します。

さて、配列にマージする要素がある場合は、<<を使用できます。

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

または、2つの配列があり、複製が必要な場合は、可変性要件の要件に基づいて、+=または単に+を使用します。

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

または、2つの配列があり、重複を無視する場合は、|=または単に|を使用します。

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