Đâ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')
Nguồn
2012-09-01 19:58:51
Đơn đặt hàng có quan trọng không? –
Bạn đang sử dụng Rails tôi giả sử? –