2014-09-04 32 views
0

這是我第一次在本網站上發佈問題;請溫柔一點。這不是功課。我會盡可能簡潔。使用Ruby打印表格中的特定數據

我有一個包含5個關鍵字列,日期列和用戶標識列的表,用於標識哪些用戶添加了該特定行數據。我的目標是打印並計算匹配關鍵字從一行iff:

1)另一行包含這些關鍵字AND具有相同的日期。

2)每行的用戶ID是唯一的。

例如:

ROW1 =>關鍵字1:(K1)1關鍵字:(K2)KEYWORD3:(K3)keyword4:(K4)keyword5:(K5)日期:(D1)的user_id:(U1)

行2 =>關鍵字1:(K6)1關鍵字:(K7)KEYWORD3:(K1)keyword4:(K2)keyword5:(K8)日期:(D1)的user_id:(U2)

ROW3 =>關鍵字1: (K6)keyword2:(K7)keyword3:(K1)keyword4:(K2)keyword5:(K8)date:(D2)user_id:(U2)關鍵詞3:(K3)關鍵詞4:(K4)關鍵詞5:(K5)日期:(D2)user_id說明:(U3)

輸出: K1(2次),K2(2次),在D1 K1(2次),K2(2次),在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 %> 

但它遠不及想什麼我來完成。如果有人甚至可以幫我理清這個僞代碼,我會很高興。

回答

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,紅寶石名稱約定(date_two而不是datetwo),布爾(你不需要「==真」爲eql?)。 除此之外的所有它不適合計算器好類型的問題

乾杯

0

我的建議是建立符合您需要的是一個數據結構。基本上是一個散列結果,其中關鍵的是關鍵字和內容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)爲第一個,第二個爲第二個日期。

比,這將是很容易顯示這個數組。