使用Ruby从表打印特定数据

时间:2014-09-04 01:25:27

标签: ruby-on-rails ruby

这是我第一次在这个网站上发帖提问;请你温柔一点。这不是家庭作业。我会尽量简洁。

我有一个包含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 %>

但它远不及我想要完成的任何事情。如果有人甚至可以帮我解决这个伪代码,我会很高兴。

2 个答案:

答案 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)用于第一个,第二个用于第二个。

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