這是做到這一點的最好辦法: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'
VS SELECT "relations".* FROM "relations" WHERE "relations"."part" = 'v04'
這是更好地在使用的ActiveRecord :: .uniq
關係,因爲它移動到獨特的數據庫,而比嘗試在Ruby的內存中做到這一點:SELECT DISTINCT car FROM "relations" WHERE "relations"."part" IN ('v03', 'v04')
順序是否重要? –
你正在使用Rails我認爲? –