Ruby on rails 在数组上执行的RubyonRails语句检查子元素字符串是否唯一

Ruby on rails 在数组上执行的RubyonRails语句检查子元素字符串是否唯一,ruby-on-rails,arrays,ruby,ruby-on-rails-4,where,Ruby On Rails,Arrays,Ruby,Ruby On Rails 4,Where,我有一个数组对象,在这个例子中,我们称它为Diff。这些差异具有多个不完全相同的字段(old\u image、new\u image、url,等等)new\u image和old\u image在本例中都有字段,最重要的是一个名为image\u file\u name的字段 我想得到一个包含所有差异的数组,该数组具有唯一的old_image.image_file_名称,即任何差异都不应具有具有相同文件名的old_图像 我相信逻辑应该是这样的 unique_diffs = Array.new @d

我有一个数组对象,在这个例子中,我们称它为
Diff
。这些差异具有多个不完全相同的字段(
old\u image
new\u image
url
,等等)
new\u image
old\u image
在本例中都有字段,最重要的是一个名为
image\u file\u name
的字段

我想得到一个包含所有差异的数组,该数组具有唯一的old_image.image_file_名称,即任何差异都不应具有具有相同文件名的old_图像

我相信逻辑应该是这样的

unique_diffs = Array.new
@diff.build.diffs.each { |diff|
    if diff.old_image.image_file_name != @diff.old_image.image_file_name
       unique_diffs.push(diff)
    end
}
或者类似的事情

@unique_diffs =  @diff.build.diffs.map{|diff| diff.old_image.image_file_name}.uniq

任何帮助都将不胜感激。

尝试以下方法:

Diff = Struct.new(:old_image)
Image = Struct.new(:image_file_name)

diffs = [
  Diff.new(Image.new('name1')),
  Diff.new(Image.new('name2')),
  Diff.new(nil),
  Diff.new(Image.new('name1')),
]

uniqs =  diffs.select { |diff| diff.old_image }.uniq { |diff| diff.old_image.image_file_name }

p uniqs # prints Diff with name1 and Diff with name 2
唯一重要的一行是调用
select
uniq
的那一行


您需要使用只保留旧图像的差异,然后使用删除具有重复图像文件名的差异。

尝试以下操作:

Diff = Struct.new(:old_image)
Image = Struct.new(:image_file_name)

diffs = [
  Diff.new(Image.new('name1')),
  Diff.new(Image.new('name2')),
  Diff.new(nil),
  Diff.new(Image.new('name1')),
]

uniqs =  diffs.select { |diff| diff.old_image }.uniq { |diff| diff.old_image.image_file_name }

p uniqs # prints Diff with name1 and Diff with name 2
唯一重要的一行是调用
select
uniq
的那一行


您需要使用只保留带有旧图像的差异,然后使用删除带有重复图像文件名的差异。

我最终使用了循环,我希望使用uniq函数使其更干净,但它似乎不起作用,它返回了所有的差异,而不是具有唯一旧图像文件名的差异

@diff.build.diffs.each { |diff|
  if diff.old_image.image_file_name == @diff.old_image.image_file_name
     # Logic went here
  end
}

仍有改进的余地,但目前这将不得不这样做。

我最终使用了循环,我希望通过uniq函数使它更干净,但它似乎不起作用,它返回了所有的差异,而不是具有唯一旧图像文件名的差异

@diff.build.diffs.each { |diff|
  if diff.old_image.image_file_name == @diff.old_image.image_file_name
     # Logic went here
  end
}

仍有改进的余地,但目前还需要改进。

它还给了我所有的差异,而不仅仅是具有唯一旧映像文件名的差异。它还给了我所有的差异,而不仅仅是具有唯一旧映像文件名的差异。要使uniq正常工作,请查看array.uniq的文档。您发现它使用了的“eql?”方法使uniq工作,只需查看array.uniq的文档。您发现它使用了