这是我第一次在这个网站上发帖提问;请你温柔一点。这不是家庭作业。我会尽量简洁。
我有一个包含5个关键字列,一个日期列和一个用户ID列的表,用于标识添加该特定数据行的用户。我的目标是打印和计算行iff:
中匹配关键字的数量1)另一行包含那些关键字AND具有相同的日期。
2)每行的用户ID是唯一的。
例如:
ROW1 => keyword1:(K1)keyword2:(K2)keyword3:(K3)keyword4:(K4)keyword5:(K5)date:(D1)user_id:(U1)
行2 => keyword1:(K6)keyword2:(K7)keyword3:(K1)keyword4:(K2)keyword5:(K8)date:(D1)user_id:(U2)
ROW3 => keyword1:(K6)keyword2:(K7)keyword3:(K1)keyword4:(K2)keyword5:(K8)date:(D2)user_id:(U2)
ROW4 => keyword1:(K1)keyword2:(K2)keyword3:(K3)keyword4:(K4)keyword5:(K5)date:(D2)user_id:(U3)
输出: D1上的K1(2次),K2(2次) D2上的K1(2次),K2(2次)
Row3应该从第一个计数中排除,因为即使匹配的单词,用户也是重复的。
以下是我的成就:
<% @prophecies.each do |prophecy| %>
<% date1 = prophecy.datetwo %>
<% @prophecies.each do |prophecy| %>
<% if date1.eql?(prophecy.datetwo) == true %>
<tr>
<td><%= prophecy.keyone %></td>
<td><%= prophecy.keytwo %></td>
<td><%= prophecy.keythree %></td>
<td><%= prophecy.keyfour %></td>
<td><%= prophecy.keyfive %></td>
</tr>
<% end %>
<% end %>
<% end %>
但它远不及我想要完成的任何事情。如果有人甚至可以帮我解决这个伪代码,我会很高兴。
答案 0 :(得分:0)
首先,最好在模型中进行,而不是在您的视图中进行。 您可以在预言类中定义类似
的方法def self.keywords_at_day(date)
#find prophecies for particular dae
prophecies = self.find_by(date:date)
# create hash with keywords for user
user_keywords = {}
prophecies.each do |prophecy|
user_keywords[prophecy.user] ||= []
user_keywords[prophecy.user] << prophecy.keyword
end
# create general array with all keywords
keywords = []
user_keywords.each do |user, kw|
keywords << kw.uniq
end
# count keywords
keywords_count = {}
keywords.each do |keyword|
keywords_count[keyword] ||= 0
keywords_count[keyword] += 1
end
keywords_count
end
def self.keywoards_lists
dates = Prophecy.all.map{|p| p.date}.uniq
keywords_lists = {}
dates.each do |date|
keywords_lists[date] = keywords_at_day(date)
end
keywords_lists
end
你是控制者
def index
@keywords_lists = Prophecy.keywords_lists
end
查看
<%= @keywords_lists.each do |date, keywords_list| %>
<tr>
<td> <%= date %> </td>
<td>
<%= keywords_list.each do |keyword, count| %>
<%= "#{keyword} encountered #{count} times" %>
<% end %>
</td>
</tr>
<% end %>
如果它真的不是作业,我建议你阅读有关MVC,ruby名称约定(date_two而不是datetwo),布尔(你不需要“== true”for eql?)。 除了所有这些对于stackoverflow来说都不是好问题
干杯
答案 1 :(得分:0)
我的建议是创建一个符合您需求的数据结构。 Basically是一个散列,其中key是关键字,并且内容是唯一使用您的关键字的uid列表:
r=[]<<{:keyword1=>"K1",keyword2:"K2",keyword3:"K3",keyword4:"k4",:date=>d1,uid:1}
r<<{:keyword1=>"K6",keyword2:"K7",keyword3:"K1",keyword4:"k2",:date=>d1,uid:2}
r<<{:keyword1=>"K6",keyword2:"K7",keyword3:"K1",keyword4:"k2",:date=>d2,uid:2}
(仅用于测试目的) 然后:
r.inject({}) do |sum,aRow|
# loop for all keywords in the row.
[:keyword1,:keyword2,:keyword3,:keyword4,:keyword4].each do |keyword|
# get each entry or create it
sum[aRow[keyword]]=elem=sum[aRow[keyword]]||{}
count=elem[aRow[:date]]||{:users=>Set.new}
count[:users]<<aRow[:uid]
elem[aRow[:date]]=count
end
sum
end
结果如下:
=> {"K1"=>
{2014-09-04 15:05:21 +0200=>{:users=>#<Set: {1, 2}>},
2014-01-01 00:00:00 +0100=>{:users=>#<Set: {2}>}},
"K2"=>{2014-09-04 15:05:21 +0200=>{:users=>#<Set: {1}>}},
"K3"=>{2014-09-04 15:05:21 +0200=>{:users=>#<Set: {1}>}},
"k4"=>{2014-09-04 15:05:21 +0200=>{:users=>#<Set: {1}>}},
"K6"=>
{2014-01-01 00:00:00 +0100=>{:users=>#<Set: {2}>},
2014-09-04 15:05:21 +0200=>{:users=>#<Set: {2}>}},
"K7"=>
{2014-01-01 00:00:00 +0100=>{:users=>#<Set: {2}>},
2014-09-04 15:05:21 +0200=>{:users=>#<Set: {2}>}},
"k2"=>
{2014-01-01 00:00:00 +0100=>{:users=>#<Set: {2}>},
2014-09-04 15:05:21 +0200=>{:users=>#<Set: {2}>}}
因此,您知道关键字“K1”已用于两个不同的日期,两个用户(1,2)用于第一个,第二个用于第二个。
然后,很容易显示这个数组。