Как отобразить определенный элемент базы данных

#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 для отображения только одной записи.