首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Ruby打印表中的特定数据

使用Ruby打印表中的特定数据
EN

Stack Overflow用户
提问于 2014-09-04 09:25:27
回答 2查看 39关注 0票数 0

这是我第一次在这个网站上发问,请温文点。这不是家庭作业。我会尽量简明扼要。

我有一个表,其中包含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应该从第一次计数中排除,因为即使单词匹配,用户也是重复的。

下面是我如何开始的:

代码语言:javascript
复制
<% @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 %>

但这与我想要实现的目标相去甚远。如果有人能帮我找出伪代码,我会很高兴的。

EN

回答 2

Stack Overflow用户

发布于 2014-09-04 20:58:37

首先,最好在你的模型中这样做,而不是在你的视图中。您可以在您的预言类中定义类似这样的方法

代码语言:javascript
复制
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

你的控制者

代码语言:javascript
复制
def index
  @keywords_lists = Prophecy.keywords_lists
end

视图

代码语言:javascript
复制
<%= @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的好问题

干杯

票数 0
EN

Stack Overflow用户

发布于 2014-09-04 21:41:23

我的建议是创建一个符合您需要的数据结构。BAsically一个散列,其中key是关键字,并包含唯一使用您的关键字的uid列表:

代码语言:javascript
复制
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}

(仅用于测试目的)然后:

代码语言:javascript
复制
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

结果如下所示:

代码语言:javascript
复制
=> {"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用于第二个日期。

然后,就很容易显示这个数组了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25655980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档