在Ruby on Rails中访问查询

时间:2012-01-02 07:53:25

标签: sql ruby-on-rails ruby scaffolding

我的控制器中有这个:

@itemsok =  Search.where("first_item_id = ?", params["3"])

这可以成为数据库搜索表中的一个查询,要求所有搜索的first_item_id = 3 ...

问题1 .-语法是我在http://guides.rubyonrails.org/active_record_querying.html中找到的,但我不确定我是否正确使用它?

好的问题2是,我在控制器上有这个,是否可以在控制器中查询?

在视图中打印变量<%= @itemsok%>我得到的只是一个

ActiveRecord::Relation:0x007fd3d3e894d8 

有什么建议吗? 提前谢谢。

3 个答案:

答案 0 :(得分:2)

ActiveRecord 3允许您将关系链接在一起,因此您可以执行以下操作:

@itemsok = Search.where("first_item_id = ?", params["3"]).where("foo = ?", "bar")

where()函数返回ActiveRecord::Relation。通常这不是问题,因为如果您使用该对象,它将自动运行查询并在对象上返回结果,这样您就可以获得数据库对象。在实际需要之前,AR不会运行查询。

哪里会返回一个项目列表(数组),所以如果您只是调试,请将您的视图更改为:

<%= debug @itemsok.to_a %>

答案 1 :(得分:1)

您似乎错误地构建了查询。

如果你想搜索first_item_id = 3的记录,你应该这样做:

Search.where("first_item_id = ?", 3)

这将返回一系列匹配记录,您无法使用<%= @itemsok %>轻松打印这些记录。您应该迭代元素并打印每个元素:

<% @itemsok.each do |item| %>
  <%= item.name %>
<% end %>

我还建议为要打印的对象定义to_s方法。

class Search
  def to_s
    name
  end
end

然后您可以简单地打印对象,并自动为您调用to_s方法:

<% @itemsok.each do |item| %>
  <%= item %>
<% end %>

答案 2 :(得分:0)

正确的方法是在模型中定义namedscope,然后在控制器中使用它。

类似的东西:

class Search < ActiveRecord::Base
 named_scope:item_ok,lambda {|*args|{:conditions=>["item_id >= ?", args.first]}} 
end

然后从控制器调用namedscope,如下所示:

@itemsok = Search.item_ok(params[:value])