向一个唯一值集合中添加元素

7

我有一个通过 collect 构建的数组。

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

我想要的是添加collect,以便我可以从v03和v04构建一个数组,使其看起来像这样。

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

然后只保留唯一值,使其看起来像这样。

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

去掉f03,因为它被列两次。

4个回答

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

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

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

谢谢,我没想到这么简单。如果第一个存储在变量car1中,第二个存储在car2中,你如何使用变量完成相同的操作? - San Backups
这是什么鬼?一个人在哪里可以找到关于这个的文档? - Tass

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  

@TonyHassan,你在使用Rails或Active Record吗?如果是的话,版本是多少? - Pritesh Jain
@TonyHassan 如果你正在使用Rails或Active Record,请检查更新后的答案。 - Pritesh Jain

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——即使是这样,一个更好的名称也是不错的。我可能会像上面展示的那样完全摆脱它),否则不要在变量前加上 ampersand。

最好使用 pluck 而不是 map,因为 pluck 只选择相关数据:SELECT car FROM "relations" WHERE "relations"."part" = 'v04' vs SELECT "relations".* FROM "relations" WHERE "relations"."part" = 'v04'

最好在 ActiveRecord::Relation 上使用 .uniq,因为它将唯一性移动到数据库中,而不是尝试在 Ruby 中进行内存操作:SELECT DISTINCT car FROM "relations" WHERE "relations"."part" IN ('v03', 'v04')


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)

第一个在Ruby中完成更多的工作,第二个在SQL中完成。


谢谢,这是一个可靠的替代方案! - San Backups

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接