2つのアレイをマージするにはどうすればよいですか?このようなもの:
@movie = Movie.first()
@options = Movie.order("RANDOM()").first(3).merge(@movie)
しかし、それは機能しません。
@options
では、@movie
を含む4つの要素を持つ配列が必要です。
このような?
⚡️ 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
この質問には2つの部分があります。
「2つの配列をマージする」方法+
メソッドを使用するだけです:
[1,2,3] + [2,3,4]
=> [1, 2, 3, 2, 3, 4]
あなたがしたいことをする方法は? (結局のところ、2つの配列をマージするわけではありません。)最初にその問題を分析しましょう。
@movie
はMovie
モデルのインスタンスであり、@movie.class.name
で確認できます。
@options
はArray
であり、@options.class.name
で確認できます。
ここで知っておく必要があるのは、配列に新しいアイテムを追加する方法です(つまり、@movie
アイテムを@options
配列に追加する)
ダブルシャベルを使用してそれを行います。
@options << @movie
これは基本的に次のようなものと同じです:
[1,2,3] << 4
=> [1,2,3,4]
@movie
はあなたの例の配列ではなく、映画のただ一つのインスタンスです。これで問題が解決するはずです。
@options << @movie
配列をマージ(結合)するには:
[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]