2012-09-01 11 views
6

したがって、私は配列によってコレクトされています。一意の値を持つコレクト配列を追加する

@a = Relation.where(part: "v04") 

@relations = @a.collect {|x| x.car} 

=> "F03"、 "F04"]

@a = Relation.where(part: "v03") 

@relations = @a.collect {|x| x.car} 

が..

=> [ "F01を構築..ビルド"、" f03 "]

私が望むのは、v03とv04の両方から配列を作成して、このように見えるように、コレクションを追加することです。

=> [ "F03"、 "F04"、 "F01"、 "F03"]

そして、それはこのようになりますようにのみ固有の値を保持します。

=>それが2回表示されたので、[ "F03"、 "F04"、 "F01"]

はF03を取り出します。一つにwhereのコールを結合していないのはなぜ

+0

問題はありますか? –

+0

あなたはRailsを使用していると思いますか? –

答えて

19
["f03", "f04"] | ["f01", "f03"] #=> ["f03", "f04", "f01"] 

car1 = ["f03", "f04"] 
car2 = ["f01", "f03"] 

car1 | car2 #=> ["f03", "f04", "f01"] 
+0

ありがとう、それはそれが簡単だったことを認識していませんでした。最初のものが変数car1に格納され、2番目のcar2に格納される場合はどうなりますか?どのように変数を使って同じことをやりますか? –

+0

@TonyHassan、更新を参照してください – megas

+0

ユニオンワークを心配しないでください。ありがとう! –

2

cars = Relation.where(part: ['v03', 'v04']).map(&:car).uniq 

または多分

car_ids = Relation.where(part: ['v03', 'v04']).select('DISTINCT car_id').map(&:car_id) 
cars = Car.where(id: car_ids) 

最初はRubyでより多くの仕事をして、SQLで二。

+0

これは堅実な選択肢です! –

3
@a = Relation.where(part: "v04") 
@relations1 = @a.collect {|x| x.car} 


@a = Relation.where(part: "v03") 
@relations2 = @a.collect {|x| x.car} 


@all_relations = @relations2 | @relations2 

あなたはレールレール3では3.2

parts = ['v03','v04'] 
@relations = Relation.where(part: parts).pluck(:name).uniq 

私は、これはこれは、この行うための最善の方法である

@relations = Relation.where(part: parts).collect(&:name).uniq 
+0

THanksこれは完璧です! –

+0

@ TonyHassan、あなたはレールやアクティブなレコードを使用していますか?もしあれば、どのバージョン? – PriteshJ

+0

@ TonyHassanあなたがレールまたはアクティブなレコードを使用している場合、更新された答えを確認してください – PriteshJ

3

動作するはずだと思う使用している場合:Relation.where(part: ['v03', 'v04']).uniq.pluck(:car)

ここだし完全な例:

require 'active_record' 

ActiveRecord::Base.establish_connection adapter: 'sqlite3', database: ':memory:' 

ActiveRecord::Schema.define do 
    self.verbose = false 
    create_table :relations do |t| 
    t.string :part 
    t.string :car 
    end 
end 

Relation = Class.new ActiveRecord::Base 

# build the relations (btw, this name makes no sense) 
Relation.create! car: 'f01', part: 'v03' 
Relation.create! car: 'f03', part: 'v03' 
Relation.create! car: 'f03', part: 'v04' 
Relation.create! car: 'f04', part: 'v04' 

# querying 
Relation.where(part: "v04").pluck(:car) # => ["f03", "f04"] 
Relation.where(part: "v03").pluck(:car) # => ["f01", "f03"] 
Relation.where(part: ['v03', 'v04']).uniq.pluck(:car) # => ["f01", "f03", "f04"] 

いくつかの考え:あなたがそれらをインスタンス変数(例えばようにしたい場合を除き

はあなたの変数の前にasperandsを入れないでください@aは明らかにaである必要があります - そして、さらに良い名前が良いでしょう。私はおそらく上記のようにそれをすべて取り除くだろう)。それはむしろ、データベースに一意性を移動するためSELECT car FROM "relations" WHERE "relations"."part" = 'v04' ActiveRecordの上.uniqを使用することをお勧めしSELECT "relations".* FROM "relations" WHERE "relations"."part" = 'v04'

対::関連:摘むだけで、関連するデータを選択するので

マップよりも摘むを使用することをお勧めしますRubyでメモリ内でそれをしようとするよりも:SELECT DISTINCT car FROM "relations" WHERE "relations"."part" IN ('v03', 'v04')

+0

アドバイスをいただきありがとうございます! –

関連する問題