如何从两个不同的数组中获得唯一的结果?

时间:2011-04-07 15:20:30

标签: ruby-on-rails ruby ruby-on-rails-3

这似乎是一个重复的问题,但我无法找到有关此问题的任何信息。我想显示远程获取的json数组的结果,通过将它们与本地表进行比较来排除某些结果。我有一个画廊模型:

t.integer :smugmug_id
t.string :smugmug_key
t.integer :category_id
t.string :category_name
t.string :description
t.integer :highlight_id
t.string :highlight_key
t.string :highlight_type
t.string :keywords
t.string :nicename
t.integer :subcategory_id
t.string :subcategory_name
t.string :title
t.string :url

此模型的数据由连接到smugmug api(json)的rake任务填充,并在本地存储数据。我试图创建一个显示所有未在本地存储的smugmug画廊的视图。

这是我迄今为止尝试过的内容,但它并没有像我想象的那样排除本地存储的画廊。

def self.not_stored
  smugmug_list = Smug::Client.new.albums(heavy = true)
  gallery_list = Gallery.select(:smugmug_id)
  smugmug_list.each do |smugmug|
    smugmug unless gallery_list.include? smugmug.id
  end
end

希望这是有道理的。我正在获取一个json数组的库,我想显示该数组,不包括相册id与我本地存储的任何记录的smugmug_id匹配的结果。

快速修改:我使用this gem的改编连接到smugmug api。

1 个答案:

答案 0 :(得分:3)

只需使用difference operator

一般例子:

ruby-1.9.2-p136 :001 > [3,2,1] - [2,1]
 => [3] 

所以你会:

smugmug_list.collect{|e| e.id} - gallery_list

Enumerable#collect会将smugmug_list转换为id列表。从那里,你可以做差异运算符,它将返回所有未在本地存储的smugmug画廊的所有id。

维护图库列表的另一个选项:

smugmug_list.select{|e|!gallery_list.include?(e.id)}