Rails查询在控制台中工作但不在视图中

时间:2014-11-21 07:42:59

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

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

用于获取与给定标记匹配的帖子的Activerecord查询在rails控制台中正常工作,但在使用View进行尝试时同样失败。我已经验证并且params正在通过,请帮助..我没有收到任何错误消息,从我可以理解的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控制台中有效。

1 个答案:

答案 0 :(得分:3)

问题

您的原始代码会向数据库发送一个文字'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数组的内容,因为这不是一般的数据库功能。