7

だから私は収集によって構築された配列を持っています。

@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"]

そして、このように見えるように、一意の値のみを保持します。

=> ["f03", "f04", "f01"]

f03 は 2 回リストされたので削除します。

4

4 に答える 4

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

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

car1 | car2 #=> ["f03", "f04", "f01"]
于 2012-09-01T19:27:01.853 に答える
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

Rails 3.2 を使用している場合

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

Rails 3では、これでうまくいくと思います

@relations  = Relation.where(part: parts).collect(&:name).uniq  
于 2012-09-01T19:38:01.363 に答える
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"]

いくつかの考え:

変数をインスタンス変数にしたい場合を除いて、変数の前にアスペランドを置かないでください (例えば、@a明らかにそうすべきでaあり、その場合でも、より良い名前が良いでしょう。上記のように、おそらく完全に削除するでしょう)。

SELECT car FROM "relations" WHERE "relations"."part" = 'v04'pluck は関連するデータのみを選択するため、map よりも pluck を使用することをお勧めします。SELECT "relations".* FROM "relations" WHERE "relations"."part" = 'v04'

ActiveRecord::Relation で使用することをお勧めします.uniq。これは、一意性を Ruby でメモリ内で実行しようとするのではなく、データベースに移動するためです。SELECT DISTINCT car FROM "relations" WHERE "relations"."part" IN ('v03', 'v04')

于 2012-09-01T19:58:51.073 に答える
2

where呼び出しを1つにまとめてみませんか?

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)

1つ目はRubyでより多くの作業を行い、2つ目はSQLでより多くの作業を行います。

于 2012-09-01T19:34:48.837 に答える