验证对象是否在Rails中的对象数组中

时间:2009-11-20 00:22:02

标签: ruby-on-rails oop

我这样做:

@snippets = Snippet.find :all, :conditions => { :user_id => session[:user_id] }

@snippets.each do |snippet|
  snippet.tags.each do |tag|
    @tags.push tag
  end
end

但如果一个片段有两次相同的标记,它会将对象推两次。

我想做像@ tags.in_object(tag)[...]

这样的事情

有可能吗?谢谢!

4 个答案:

答案 0 :(得分:1)

另一种方法是简单地连接@tags和snippet.tags数组,然后将其删除重复数据。

@snippets.each do |snippet|
  @tags.concat(snippet.tags)
end

@tags.uniq!

答案 1 :(得分:1)

我认为有两种方法可以让它获得更快的结果。

1)在find语句中添加一个条件(在MySQL DISTINCT中)。这将只返回唯一的结果。在获得结果时,DB通常比常规代码做得更好。

2)相反,如果每次使用include进行测试,为什么不在填充数组后执行uniq。

这是示例代码

ar = []
data = []

#get some radom sample data
100.times do 
data << ((rand*10).to_i) 
end

# populate your result array
# 3 ways to do it.
# 1) you can modify your original array with 

data.uniq!

# 2) you can populate another array with your unique data
# this doesn't modify your original array
ar.flatten << data.uniq

# 3) you can run a loop if you want to do some sort of additional processing

data.each do |i|
 i = i.to_s + "some text" # do whatever you need here
 ar << i
end

根据具体情况,您可以使用。

但是在循环中的每个项目上运行include并不是最快的事情恕我直言

祝你好运

答案 2 :(得分:0)

我假设@tagsArray个实例。

Array#include?测试对象是否已包含在数组中。这使用==运算符,它在ActiveRecord中测试同一个实例或具有相同id的同一类型的另一个实例。

或者,您可以使用Set代替Array。这样可以保证不会添加重复项,但是无序重复。

答案 3 :(得分:0)

您可以在查询中添加一个组:

Snippet.find :all, :conditions => { :user_id => session[:user_id] }, :group => "tag.name"

当然,小组将取决于您的标签数据的工作方式。

或使用uniq:

@tags << snippet.tags.uniq