【问题标题】:Rails query works in console but not in viewRails 查询在控制台中有效,但不在视图中
【发布时间】:2015-01-19 07:22:50
【问题描述】:

我一直在为 Rails 构建一个练习应用程序。这是一个简单的博客应用程序,只有文章模型和使用 Postgresql 数组完成的标记系统。一切都很好,除了我无法让特定标签的页面正常工作。

用于获取与给定标签匹配的帖子的 Activerecord 查询在 Rails 控制台中正常工作,但在尝试使用 View 时同样失败。我已经验证并且参数正在通过,请帮助.. 我没有收到任何错误消息,据我所知,rails 通过 ActiveRecord::Relation::ActiveRecord_Relation_Article 作为结果查询视图,但视图文件无法按列表显示...

以下是相关文件,

routes.rb

  get 'tags/:tag', to: 'articles#tagview', as: :tag

articles_controller.rb

  def tagview
    @articles = Article.where("'params[:tag]' = ANY (tags)")
  end

tagview.html.erb

    <% @articles.each do |article| %>
      <tr>
        <td><%= article.title %></td>
        <td><%= article.content %></td>
        <td><%= article.tags.join(" ") %></td>
      </tr>
    <% end %>

结果页面只是空白。而上述查询在 Rails 控制台中有效。

【问题讨论】:

  • 查看页面上查看@articles.count?它打印什么?
  • 我建议您首先查看您的日志文件 (log/development.log),然后比较控制台和控制器生成的 SQL 查询,看看有什么区别。在此处粘贴实际的 SQL 查询甚至可能会有所帮助。

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


【解决方案1】:

问题

您的原始代码将文字 'params[:tag]' 字符串发送到数据库,它不知道如何处理它。生成的查询类似于:

SELECT * FROM articles WHERE ('params[:tag]' = ANY (tags));

这仅返回实际使用文字 "params[:tag]" 字符串标记的文章。

解决办法

我猜您打算将params[:tag] 替换为来自params 的实际标签值。为此,您需要执行以下操作:

Article.where(['? = ANY (tags)', params[:tag]])

这将导致类似这样的内容被发送到数据库(当 params[:tag] 设置为 "foo" 时为 fx):

SELECT * FROM articles WHERE ('foo' = ANY (tags));

这更有可能是您想要的。

进一步阅读

如果您想详细了解如何使用 Active Record 构建查询,section about Conditions in the Active Record Query Interface guide 是一个不错的起点。

您可能不会在官方文档中找到任何关于使用 PostgreSQL 数组的内容,因为这不是一般的数据库功能。

【讨论】:

  • 哇,这按预期工作.. 谢谢.. 顺便说一句,我将来可以参考任何来源吗?我已经阅读了官方的 Activerecord 查询指南,但 id 并没有多大帮助。
  • 我已经更新了我的答案,提供了更多详细信息和相关文档的链接。
  • 数组实际上是标准 SQL 的一部分。不过,ActiveRecord 对 SQL 却一无所知。
猜你喜欢
  • 1970-01-01
  • 2012-07-27
  • 1970-01-01
  • 2014-10-16
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
  • 2018-09-13
  • 2023-03-19
相关资源
最近更新 更多