[英]Displaying associated records in rails
我有一個User
, List
和Task
模型。
任務 belongs_to
用戶和列表 , 列表 has_many
任務和belongs_to
用戶 ,以及用戶 has_many
list和has_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_recent
與list.most_recent_task
。 如果你的列表總是至少有一個任務,那么你可以完全擺脫保護條款(即if
)。
作為進一步的重構,您可能希望從視圖中進行一些計算,並為列表索引創建“演示者”,這只是每個列表的演示者數組。 單個演示者應該是一個普通對象,其中包含有關列表的所需信息,預先計算:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.