在ActiveRecord上使用select会抛出“无路由匹配”

时间:2012-06-26 11:55:44

标签: ruby-on-rails ruby-on-rails-3 activerecord

发生了一件非常奇怪的事情,我不知道如何解决它。

我的数据库上有两个班级。项目和时间日志。

在我的Projects控制器的索引方法上,我列出了一个项目列表,我还想列出为该项目输入任何日志的最后日期。

当我运行下面的代码时,我收到以下错误。

No route matches {:action=>"show", :controller=>"projects", :id=>#<Project id: nil, name: "Project A", user_id: 1, created_at: nil, updated_at: nil>}

如果我评论“选择”行并取消注释上面的行(使用Project.all),一切都很完美。

知道为什么会这样吗?

def index
    #@projects = Project.all

    @projects = Project.select("julianday(Date('now')) - julianday(log.timeofevent) as diff, *").joins("left outer join timelogs log on projects.id = log.project_id").group("projects.id").order("log.timeofevent asc")

    respond_to do |format|
        format.html # index.html.erb
        format.json { render json: @projects }
    end
end

2 个答案:

答案 0 :(得分:0)

这很可能是因为在视图中您的代码正在尝试创建将显示每个项目的链接。这可能如下所示:

link_to 'Show', project

或者也许是这样:

link_to 'Show', project_path(project)

您的查询中的某些内容返回的行没有projects.id(正如您在错误中看到的那样,idnil)。我怀疑你的错误是group函数,它需要一个聚合函数,所以它肯定是错误的,我不确定为什么它会导致null project.id。您的意思是使用order吗?

我刚刚意识到你可能正在使用它来摆脱重复。所以无论如何,回到其他所有人的地方我想 - 需要更多信息:)

答案 1 :(得分:0)

非常感谢答案。你是对的。实际上,问题在于视图试图生成链接并且缺少ID等内容。

我认为这样可行:

@projects = Project.select("julianday(Date('now')) - julianday(log.timeofevent) as diff, *").joins("left outer join timelogs log on projects.id = log.project_id").group("projects.id").order("log.timeofevent asc")
但是,显然单靠“(明星)”是行不通的。我不得不将其替换为“projects。(star)”

因此,生成的固定代码(工作正常)是:

@projects = Project.select("julianday(Date('now')) - julianday(log.timeofevent) as diff, projects.*").joins("left outer join timelogs log on projects.id = log.project_id").group("projects.id").order("log.timeofevent asc")