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