我有以下声明:
@all_comments = Comment.find(@task.id)
问题是,如果没有注释,则会抛出记录未找到错误。如何让它无声地失败,所以它什么都不返回?
答案 0 :(得分:5)
你要做的事情永远不会奏效。
第find(@task.id)
行会查找与id
具有相同task
的评论,而这通常不是您设置关系的方式。
通常你会有一个任务和一个评论表,而评论表会有一个名为task_id
的列。如果是这种情况,您可以按如下方式编写模型:
class Task
has_many :comments
end
class Comment
belongs_to :task
end
然后你可以简单地写:
@all_comments = @task.comments
答案 1 :(得分:1)
我不使用AR,但我相信:
@all_comments = Comment.find(:first, @task.id)
如果找不到记录,将返回nil,而不像#find
没有任何修饰符。
编辑|还有一条捷径:
@all_comments = Comment.first(@task.id)
答案 2 :(得分:1)
我认为你的失败与你期望的不同。您的查询要求Comment
标识为@task.id
(Task
的ID)。
您的查询应该是这样的:
@all_comments = Comment.where(:task_id => @task.id)
甚至更好
@task.comments
如果您已相应地声明了您的关系,并且允许更多选项(添加注释,......),这应该有效。
答案 3 :(得分:0)
导轨会导致RecordNotfound
次呼叫find
异常。使用find_by
来避免这种情况。
如果您尝试通过task_id获取任务列表,请使用find_all_by
方法:
# returns an empty array when no tasks are found
@comments = Comment.find_all_by_task_id(@task.id)
否则使用find_by
# returns nil when no task is found
@comment = Comment.find_by_task_id(@task.id)