#ruby-on-rails #ruby
#ruby-on-rails #ruby
Вопрос:
В моем приложении rails есть набор баз данных.
def index
@clubs = Club.all
end
Это мой контроллер.
Если я введу свой Index.html.erb
<% @clubs.each do |club| %>
<%= club.name %>
<% end %>
Я получаю все имена моей базы данных, отображаемые в моем индексном представлении.
Что, если я просто хочу выбрать один или всего пару? Через консоль rails я могу, набрав c =Club.find(1) 1 по умолчанию принимает id = 1. Итак, как я могу просто отобразить несколько идентификаторов, а не все базы данных в одном и том же index.html.erb.
в любом случае спасибо!
Ответ №1:
Попробуйте это:
Давайте рассмотрим, что params[:ids]
содержит все идентификаторы, которые принадлежат записям, которые вы хотите получить.
def index
@clubs = Club.where(id: params[:ids])
end
Ответ №2:
Исправить
Простой ответ здесь заключается в том, чтобы порекомендовать вам взглянуть на методы ActiveRecord, которые вы можете вызывать в своем контроллере; в частности .where
:
#app/controllers/clubs_controller.rb
Class ClubsController < ApplicationController
def index
@clubs = Club.where column: "value"
end
end
Это позволит заполнить @clubs
переменную экземпляра только теми записями, которые соответствуют этому конкретному условию. Помните, что это ваше приложение Rails, поэтому вы можете делать с ним все, что хотите.
Конечно, рекомендуется придерживаться соглашения, но ничто не мешает вам заполнить определенные данные в вашей @clubs
переменной
—
RESTful
Как кто-то упоминал, вы не должны включать «отфильтрованные» записи в index
действие. Хотя лично я не согласен с этой идеей, факт остается фактом: Rails разработан так, чтобы отдавать предпочтение соглашению, а не конфигурации, что означает, что вам действительно следует оставить index
действие как показ all
записей
Возможно, вы захотите создать collection
конкретное действие:
#config/routes.rb
resources :clubs do
collection do
get :best #-> domain.com/clubs/best
end
end
#app/controllers/clubs_controller.rb
Class ClubsController < ApplicationController
def best
@clubs = Club.where attribute: "value"
render "index"
end
end
Ответ №3:
Существует несколько способов выбора конкретной записи или группы записей из базы данных. Например, вы можете получить один клуб с:
@club = Club.find(x)
где x — идентификатор клуба. Затем в вашем представлении ( .html.erb
файле) вы можете просто получить доступ к атрибутам @club
объекта.
Вы также можете использовать более широкую сеть:
@disco_clubs = Club.where(type: "disco") # returns an ActiveRecord Relation
@disco_clubs = Club.where(type: "disco").to_a # returns an array
И затем вы можете выполнять итерации по ним таким же образом, как вы делаете в своем index.html.erb
. Rails имеет богатый интерфейс для запросов к базе данных. Проверьте это здесь.
Также обратите внимание, что отдельные записи, такие как те, которые выбраны с помощью find
метода, чаще всего используются с show
действием, которое предназначено для отображения одной записи. Конечно, это для обычных CRUD-приложений. Это не жесткое правило.
Ответ №4:
изменить
def index
@clubs = Club.all
end
к этому
def index
@clubs = Club.find(insert_a_number_that_is_the_id_of_the_club_you_want)
end
Запрос к вашей базе данных — сложная вещь, которая предоставляет вам массу возможностей, чтобы вы могли получить ИМЕННО то, что вы хотите, и поместить это в свою @clubs
переменную. Я предлагаю прочитать эту часть руководства по rails
Следует также отметить, что если вы собираетесь запрашивать в своей базе данных только одну запись, то измените @clubs
на @club
, чтобы вы знали, чего ожидать.
Комментарии:
1.
index
Метод не должен отображать только одну запись. Обычно это делается с помощью другого вызываемого методаshow
, у которого был бы свой собственный шаблон,show.html.erb
. (Кроме того, у вас есть опечатка в определении вашего метода.)2. Отличный момент. @EgeErsoz, Hmgaar — действие index МОЖЕТ отображать только одну запись, но, как указано выше, оно не должно указывать только на одну запись. Index — это метод, предназначенный для перечисления всего в виде индекса, в данном случае он должен индексировать clubs, вы должны использовать метод show для отображения только одной записи.