我这样做:
@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)[...]
这样的事情有可能吗?谢谢!
答案 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)
我假设@tags
是Array
个实例。
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