Доступ к запросу в Ruby on Rails - PullRequest
1 голос
/ 02 января 2012

У меня в контроллере есть это:

@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 ]

2 голосов
/ 02 января 2012

ActiveRecord 3 позволяет связывать отношения вместе, чтобы вы могли сделать что-то вроде этого:

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

Функция where() возвращает ActiveRecord::Relation. Обычно это не проблема, поскольку, если вы используете объект, он автоматически выполнит запрос и вернет результаты для объекта, чтобы вы получили объекты базы данных. AR не запускает запрос, пока он на самом деле не нужен.

Где будет возвращаться список элементов (Массив), поэтому, если вы просто отлаживаете, измените ваше представление на это:

<%= debug @itemsok.to_a %>
1 голос
/ 02 января 2012

Вы, похоже, неправильно строите запрос.

Если вы хотите искать записи с 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 %>
0 голосов
/ 02 января 2012

Правильный способ сделать это - определить namedscope в модели, а затем использовать его в контроллере.

Что-то похожее на это:

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

, а затем вызвать namedscope с контроллера следующим образом:

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