1

UserListおよびTaskモデルがあります。

タスク belongs_to ユーザーリストリスト has_many タスクbelongs_to ユーザー、およびユーザー has_many リストhas_many タスク

表示したいものの一部がインデックス ビューで動作しており、ハングアップしているスナフが 1 つだけあります。

最初に作成したタスクをすべてのリストのインデックス ビューに表示できます。問題は、リストがタスクに関連付けられていない場合でも、作成された最初のタスクがすべてのリストに対して表示されることです。

リスト インデックス ビューでは、作成された最初のタスクがリストに関連付けられている場合にのみ表示されるようにします。

タスク モデル:

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

タスクモデルを作成したときにこのような列が作成されたので、正しく理解していないに違いありません

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

メソッドはTaskmost_recentの最初のタスクを返します。このメソッドには、タスクをリストに結び付けるものは何もありません。このリストの最初のタスクを取得するには、このメソッドに list_id を渡す必要があります。

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

編集:他の解決策は機能しませんでした。

于 2012-10-28T09:08:08.703 に答える
0

あなたの説明に基づいて、リストごとに、そのリストの最新のタスクを表示したいようには思えません。むしろ、たまたまそれを含むリストごとに 1 回、全体的な最新のタスクを複数回表示したいようです。これを実現するには、 に置き換えif 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。また、リストに常に少なくとも 1 つのタスクが含まれる場合は、ガード句 (つまりif) を完全に取り除くことができます。

さらなるリファクタリングとして、ビューからいくつかの計算を取り除き、リスト インデックスの「プレゼンター」を作成することができます。これは、個々のリストのプレゼンターの配列になります。個々のプレゼンターは、事前に計算された、リストについて必要な情報を含むプレーンなオブジェクトである必要があります。

  • 名前
  • URL
  • 説明
  • 最新のタスクのユーザーのグラバター URL
于 2012-10-28T09:12:49.947 に答える