2012-09-01 2 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"]

그리고이 같은 모양으로 만 고유 한 값을 유지한다.

=>가 두 번 나열하고 있기 때문에 "F03", ""F04 "F01"]

는 F03 꺼내.

+0

주문이 중요합니까? –

+0

레일을 사용하고 있습니까? –

답변

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

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

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

감사합니다. 그렇게 간단하지 않다는 것을 알지 못했습니다. 첫 번째 변수가 car1 변수에 저장되고 두 번째 car2 변수에 저장된 경우 어떻게됩니까? 변수를 사용하여 어떻게 동일한 작업을 수행합니까? –

+0

@TonyHassan, 업데이트 – megas

+0

유니온 작동에 신경 쓰지 마십시오. 감사! –

2

where 전화를 하나로 결합하지 않습니까?

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) 

첫 번째는 루비에서 더 많은 작업을 수행, 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' 액티브에 .uniq를 사용하는 것이 좋습니다 SELECT "relations".* FROM "relations" WHERE "relations"."part" = 'v04'

대 :: 관계 : 뽑는다는 관련 데이터를 선택하기 때문에

지도에 비해 당기기를 사용하는 것이 좋습니다 Ruby로 메모리에서 시도하는 것보다 : SELECT DISTINCT car FROM "relations" WHERE "relations"."part" IN ('v03', 'v04')

+0

조언 해 주셔서 감사합니다! –

관련 문제