这是我第一次在这个网站上发问,请温文点。这不是家庭作业。我会尽量简明扼要。
我有一个表,其中包含5个关键字列、一个日期列和一个用户ID列,用于标识哪个用户添加了该特定数据行。我的目标是打印并计算一行中匹配的关键字的数量:
1)另一行包含这些关键字并具有相同的日期。
2)每行的用户ID是唯一的。
例如:
Row1=> keyword1:(K1) keyword2:(K2) keyword3:(K3) keyword4:(K4) keyword5:(K5)日期:(D1) user_id:(U1)
Row2=> keyword1:(K6) keyword2:(K7) keyword3:(K1) keyword4:(K2) keyword5:(K8)日期:(D1) user_id:(U2)
Row3=> keyword1:(K6) keyword2:(K7) keyword3:(K1) keyword4:(K2) keyword5:(K8)日期:(D2) user_id:(U2)
Row4=> keyword1:(K1) keyword2:(K2) keyword3:(K3) keyword4:(K4) keyword5:(K5)日期:(D2) user_id:(U3)
输出: K1 (2次),K2 (2次),on D1 K1 (2次),K2 (2次),on D2
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 %>但这与我想要实现的目标相去甚远。如果有人能帮我找出伪代码,我会很高兴的。
发布于 2014-09-04 20:58:37
首先,最好在你的模型中这样做,而不是在你的视图中。您可以在您的预言类中定义类似这样的方法
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),booleans (你不需要"==true“来表示eql?)。除此之外,这不是stackoverflow的好问题
干杯
发布于 2014-09-04 21:41:23
我的建议是创建一个符合您需要的数据结构。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)用于第一个日期,2用于第二个日期。
然后,就很容易显示这个数组了。
https://stackoverflow.com/questions/25655980
复制相似问题