簡體   English   中英

在rails中顯示相關記錄

[英]Displaying associated records in rails

我有一個UserListTask模型。

任務 belongs_to 用戶列表列表 has_many 任務belongs_to 用戶 ,以及用戶 has_many listhas_many 任務

我有一部分想要在我的索引視圖中顯示的內容,只有一個我想要掛起的snafu。

我能夠在所有列表的索引視圖中顯示第一個創建的任務。 問題是,即使列表未與任務相關聯,也會為所有列表顯示創建的第一個任務。

在列表索引視圖中,我希望創建的第一個任務僅在與列表關聯時才顯示。

任務模型:

class Task < ActiveRecord::Base
  attr_accessible :completed, :description, :list_id, :user_id

  belongs_to :list
  belongs_to :user

  scope :completed, where(:completed => true)
  scope :incomplete, where(:completed => false)

  def self.most_recent
    first(:order => 'id ASC' ) # or whatever query you need to get the most recent
  end

end

列表索引視圖 -

<div class="span12 offset2"> 
 <% @lists.each do |list| %> 
  <div class="well row span4">
    <div class="span3">
    </div>  
    <div class="span4">   
      <span class="lead">
        <%= link_to "#{list.name}", list_url(list) %>
      </span>
      <p>
        <%= list.description %>
      </p><hr>
      <div class="pull-right" id="gage-<%= list.id %>" style="width:170px; height:100px;"></div>
      <br>  
      <span class="offset1">
        <% if Task.most_recent %>
          <span class="pull-left"> <%= image_tag Task.most_recent.user.gravatar_url, :class => "gravatar_index" %></span>
        <% end %>  
      </span>
    </div>
  <% end %>
</div>

我還是鐵桿新手,但我知道我非常接近。 我在這里俯瞰什么? 強調文字

===========

編輯

我已經測試了@Baldrick的解決方案,現在似乎又出現了另一個錯誤

我對所述解決方案的看法 -

<% if Task.most_recent(list) %>
      <span class="pull-left"> <%= image_tag Task.most_recent.user.gravatar_url, :class => "gravatar_index" %></span>
<% end %>

我現在得到的錯誤 -

SQLite3::SQLException: no such column: tasks.list: SELECT  "tasks".* FROM "tasks"  WHERE "tasks"."list" = 4 ORDER BY id ASC LIMIT 1

我不能正確理解,因為我在創建Task模型時有這樣一個創建的列

class CreateTasks < ActiveRecord::Migration
  def change
    create_table :tasks do |t|
      t.string :description
      t.boolean :completed, :default => false
      t.integer :list_id

      t.timestamps
    end
  end
end

這是一個我需要添加索引才能進行查詢的情況嗎?

most_recent方法為您提供了所有任務的最后一個創建任務。 你知道什么是給定列表的最新任務。

您應該為列表指定一個參數

def self.most_recent(list)
  where(list_id: list.id).order('id ASC').first # or whatever query you need to get the most recent
end

您的most_recent方法返回Task的第一個任務。 此方法中沒有任何內容將任務綁定到任何列表。 您需要將list_id傳遞給此方法以獲取此列表的第一個任務,例如

def self.most_recent(list_id)
    first(:order => 'id ASC', :list_id => list_id) 
end

編輯:其他解決方案無效。

根據您的描述,它聽起來並不像你想,每個列表,以顯示該列表中的最近的任務。 相反,似乎您希望將最近的總體任務多次出現,一次針對恰好包含它的每個列表。 為了達到這個目的,你想要將if Task.most_recent替換為if list.tasks.include? Task.most_recent if list.tasks.include? Task.most_recent

- -編輯 - -

好的,如果你真的想為每個列表顯示該列表的最新任務,那么你應該以相同的方式進行此操作。 List類中,您應該具有以下方法:

def most_recent_task
    tasks.first(:order => 'id ASC') # or whatever
end

然后,在你看來,你要換兩次出現的Task.most_recentlist.most_recent_task 如果你的列表總是至少有一個任務,那么你可以完全擺脫保護條款(即if )。

作為進一步的重構,您可能希望從視圖中進行一些計算,並為列表索引創建“演示者”,這只是每個列表的演示者數組。 單個演示者應該是一個普通對象,其中包含有關列表的所需信息,預先計算:

  • 名稱
  • 網址
  • 描述
  • 最近任務的用戶的gravatar url

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM