1

我有一个User,ListTask模型。

一个任务 belongs_to 用户列表,一个列表 has_many 任务belongs_to 用户,以及一个用户 has_many 列表has_many 任务

我有一部分我想在我的索引视图中显示的工作,只有一个我被挂断的混乱。

我能够在所有列表的索引视图中显示第一个创建的任务。问题是,为所有列表显示创建的第一个任务,即使列表与任务无关。

在列表索引视图中,我希望创建的第一个任务仅在与列表关联时才显示。

任务模型:

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>

我对 Rails 还是很陌生,但我知道我已经很接近了。我在这里俯瞰什么?强调文本

===========

编辑

我已经测试了@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

我一定没有正确理解,因为我在创建任务模型时创建了这样一个列

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

这是我需要添加索引才能进行查询的情况吗?

4

3 回答 3

2

该方法为您提供所有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
于 2012-10-28T09:13:02.397 回答
1

您的most_recent方法返回 Task 的第一个任务。此方法中没有任何内容将任务绑定到任何列表。您需要将 list_id 传递给此方法以获取此列表的第一个任务,例如

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

编辑:其他解决方案不起作用。

于 2012-10-28T09:08:08.703 回答
0

根据您的描述,您似乎希望为每个列表显示该列表的最新任务。相反,您似乎希望整个最近的任务出现多次,每个列表恰好包含它一次。要实现这一点,您需要替换if Task.most_recentif 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)。

作为进一步的重构,您可能希望从视图中进行一些计算,并为您的列表索引创建“演示者”,这将只是每个单独列表的演示者数组。单个演示者应该是一个普通对象,其中包含您需要的有关列表的信息,预先计算:

  • 姓名
  • 网址
  • 描述
  • 最近任务用户的头像 url
于 2012-10-28T09:12:49.947 回答