Ruby on rails 在rails中显示关联记录

Ruby on rails 在rails中显示关联记录,ruby-on-rails,activerecord,view,model,Ruby On Rails,Activerecord,View,Model,我有一个用户,列表,和任务模型 一个任务属于用户和列表,一个列表有许多任务和属于用户,一个用户有许多列表和有许多任务 我想在我的索引视图中显示的内容中有一部分正在工作,只有一个我挂断的问题 我能够在所有列表的索引视图中显示第一个创建的任务。问题是,为所有列表显示创建的第一个任务,即使该列表未与该任务关联 在列表索引视图中,我希望创建的第一个任务仅在与列表关联时显示 任务模型: 我一定没有正确理解,因为我在创建任务模型时创建了这样一个列 class CreateTasks < Active

我有一个
用户
列表
,和
任务
模型

一个任务
属于
用户和列表,一个
列表有许多
任务和
属于
用户,一个
用户有许多
列表和
有许多
任务

我想在我的索引视图中显示的内容中有一部分正在工作,只有一个我挂断的问题

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

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

任务模型:

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

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
class CreateTasksfalse
t、 整数:列表\u id
t、 时间戳
结束
结束
结束

在这种情况下,我需要添加索引才能进行查询吗?

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

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

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

根据您的描述,对于每个列表,您似乎不希望显示该列表的最新任务。更确切地说,您似乎希望将最近的整个任务显示多次,对于恰好包含它的每个列表显示一次。要实现这一点,您需要用
if list.tasks.include>替换
if任务。最新的
?任务。最近的

---编辑---

好的,如果你真的想为每个列表显示该列表最近的任务,那么你应该以完全不同的方式进行。在
列表中
类中,您应该有以下方法:

def most_recent_task
    tasks.first(:order => 'id ASC') # or whatever
end
然后在您的视图中,您将用
list.most\u recent\u Task
替换两个出现的
Task.most\u recent\u Task
。如果您的列表总是至少有一个任务,那么您就可以完全取消guard子句(即
if

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

  • 名字
  • 网址
  • 描述
  • 最近任务的用户的gravatar url

最新的方法
为您提供所有任务中的最后一个创建任务。您看到的是给定列表中最近的任务

您应该为列表提供一个参数

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

每个块缺少的
只是一个输入错误吗?没错,它被留在了c和p上。它抱怨是因为使用了列表而不是列表id。这是因为@Baldrick的代码中有一个错误。在最新的方法中,该方法应该与我在答案中作为第一选项的方法类似。使用Baldrick的代码,它应该是
where(list\u id:list)。order('id ASC')。首先
和我的视图将是相同的,只是将list作为参数
任务传递。最近的(list)
?这是我最终采用的解决方案。请参阅@jtblin对此解决方案的评论,因为这是我让此解决方案工作的唯一方式。这应该是
where(list\u id:list.id)
,还是您真的可以在
where(list\u id:list)
?我不确定,因此,我用
list\u id:list.id
编辑了答案。获取
未定义的方法
most\u-recent'for#`此错误。在我看来,我现在应该有
“gravatar_index”%>
好的,我只保留了第一个选项,请按原样尝试,它应该可以正常工作。这不是我想要的结果。我想让它看起来好像你有独立的列表,彼此无关,因此任务将是无关的。我确实想为该列表显示最新的任务:)是的,这很可能是我重构后将采用的方法,据我所知,从惯例和工作流角度来看,重构应该尽早完成。也就是说,谢谢你补充你的答案。
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
def self.most_recent(list_id)
    first(:order => 'id ASC', :list_id => list_id) 
end
def most_recent_task
    tasks.first(:order => 'id ASC') # or whatever
end
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