2012-09-01 27 views
6

Vì vậy, tôi có một mảng được xây dựng bằng cách thu thập.Gắn một mảng thu thập với các giá trị duy nhất

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

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

xây dựng ..

=> [ "F03", "F04"]

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

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

xây dựng ..

=> [ "F01 "," f03 "]

Điều tôi muốn là nối thêm tập hợp sao cho tôi có thể tạo một mảng từ cả v03 và v04 sao cho nó trông như thế này.

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

Và sau đó chỉ giữ giá trị duy nhất để nó trông như thế này.

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

Đi ra F03 vì nó đã được liệt kê hai lần.

+0

Đơn đặt hàng có quan trọng không? –

+0

Bạn đang sử dụng Rails tôi giả sử? –

Trả lời

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

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

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

Cảm ơn đã không nhận ra nó là đơn giản. Điều gì xảy ra nếu lần đầu tiên được lưu trữ trong biến car1 và car2 thứ hai. Làm thế nào bạn sẽ làm điều tương tự bằng cách sử dụng các biến? –

+0

@TonyHassan, xem cập nhật – megas

+0

Không bao giờ làm việc liên hiệp. Cảm ơn! –

2

Tại sao không kết hợp các cuộc gọi where thành một?

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

hoặc có thể

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

Đầu tiên làm việc ở Ruby, lần thứ hai trong SQL.

+0

Cảm ơn đây là một giải pháp thay thế vững chắc! –

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 

Nếu bạn đang sử dụng đường ray 3,2

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

Trong ray 3 Tôi nghĩ rằng điều này sẽ làm việc

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

THanks rất nhiều điều này là hoàn hảo! –

+0

@TonyHassan, bạn có đang sử dụng đường ray hoặc bản ghi hoạt động không? nếu có phiên bản nào? – PriteshJ

+0

@TonyHassan kiểm tra câu trả lời cập nhật nếu bạn đang sử dụng đường ray hoặc bản ghi hoạt động – PriteshJ

3

Đây là cách tốt nhất để làm điều này: Relation.where(part: ['v03', 'v04']).uniq.pluck(:car)

Dưới đây là ví dụ đầy đủ:

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

Vài suy nghĩ:

Đừng đặt asperands trước các biến của bạn, trừ khi bạn muốn họ được biến dụ (ví dụ @a rõ ràng là a - và thậm chí sau đó, tên tốt hơn sẽ tốt. Tôi có lẽ sẽ thoát khỏi nó hoàn toàn như được hiển thị ở trên).

Nó là tốt hơn để sử dụng nhổ hơn bản đồ, vì nhổ chỉ chọn các dữ liệu liên quan: SELECT car FROM "relations" WHERE "relations"."part" = 'v04' vs SELECT "relations".* FROM "relations" WHERE "relations"."part" = 'v04'

Nó là tốt hơn để sử dụng .uniq trên ActiveRecord :: Quan hệ vì nó di chuyển độc đáo vào cơ sở dữ liệu khá hơn là cố gắng làm điều đó trong bộ nhớ với Ruby: SELECT DISTINCT car FROM "relations" WHERE "relations"."part" IN ('v03', 'v04')

+0

Cảm ơn lời khuyên của bạn! –

Các vấn đề liên quan