Список уникальных значений из коллекции - PullRequest
0 голосов
/ 22 сентября 2018

В моем приложении есть таблица «Ссылки», которая содержит, помимо прочего, страну, штат и город.

Каждый пользователь может опубликовать собственную ссылку, указав в качестве обязательных значений страну, штат и город.

Моя домашняя страница содержит список всех ссылок всех пользователей и имеет раскрывающийся список, в котором должны отображаться все страны, уже зарегистрированные в ссылках, который затем должен фильтровать записи другого раскрывающегося списка, в котором должны быть зарегистрированы все города + штаты, уже зарегистрированные ввсе ссылки в выбранной стране.

Мне удалось перечислить все отдельные города из ссылок:

  <li class="dropdown">
    <a href="#" class="dropdown-toggle" id="drop3" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Select city&nbsp;&nbsp;⌄</a>
    <ul class="dropdown-menu" aria-labelledby="drop3">
      <% Link.select(:city).distinct(&:city).uniq do |link|%>
        <li><%= link_to link.city, root_path(city: link.city), class: "btn-purple" %></li>
      <% end %>
    </ul>
   </li>

Мой вопрос заключается в том, как составить список уникальных значений для выпадающего списка стран иОтфильтруйте этот выпадающий список.После этого я хотел бы знать, как отправить информацию в виде параметра URL-адреса для перенаправления на домашнюю страницу с отфильтрованными результатами.

Я создал маршрут к root_path с ":city" в качестве параметра,поэтому, следуя "localhost:3000/?city=City%20Name", ссылки на домашнюю страницу фильтруются по зарегистрированному городу.

РЕДАКТИРОВАТЬ

Я изменил свой вопрос, чтобы показать schema.rb и контроллер ссылок:

schema.rb links

create_table "links", force: :cascade do |t|
  t.string "title"
  t.string "url"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
  t.integer "user_id"
  t.integer "cached_votes_total", default: 0
  t.integer "cached_votes_score", default: 0
  t.integer "cached_votes_up", default: 0
  t.integer "cached_votes_down", default: 0
  t.string "image_file_name"
  t.string "image_content_type"
  t.integer "image_file_size"
  t.datetime "image_updated_at"
  t.text "description"
  t.string "country"
  t.string "city"
  t.string "address"
  t.integer "street_number"
  t.string "neighborhood"
  t.string "route"
  t.string "administrative_area_level_1"
  t.integer "postal_code"
  t.index ["cached_votes_down"], name: "index_links_on_cached_votes_down"
  t.index ["cached_votes_score"], name: "index_links_on_cached_votes_score"
  t.index ["cached_votes_total"], name: "index_links_on_cached_votes_total"
  t.index ["cached_votes_up"], name: "index_links_on_cached_votes_up"
  t.index ["user_id"], name: "index_links_on_user_id"
end

links_controller.rb

class LinksController < ApplicationController
  load_and_authorize_resource
  before_action :set_link, only: [:show, :edit, :update, :destroy]
  before_action :authenticate_user!, except: [:index, :show]

  # GET /links
  # GET /links.json
  def index
    @links = Link.all
    if params[:tag]
      @links = Link.tagged_with(params[:tag])
    end
    if params[:city]
      @links = Link.where(city: params[:city])
    end
  end

  def new
    @link = current_user.links.build
  end

  # POST /links
  # POST /links.json
  def create
    @link = current_user.links.build(link_params)
    @link.user_id = current_user.id
    respond_to do |format|
      if @link.save
        format.html { redirect_to @link, notice: 'Link was successfully created.' }
        format.json { render :show, status: :created, location: @link }
      else
        format.html { render :new }
        format.json { render json: @link.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /links/1
  # PATCH/PUT /links/1.json
  def update
    respond_to do |format|
      if @link.update(link_params)
        format.html { redirect_to @link, notice: 'Link was successfully updated.' }
        format.json { render :show, status: :ok, location: @link }
      else
        format.html { render :edit }
        format.json { render json: @link.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /links/1
  # DELETE /links/1.json
  def destroy
    @link.destroy
    respond_to do |format|
      format.html { redirect_to links_url, notice: 'Link was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  def upvote
    @link = Link.find(params[:id])
    @link.upvote_by current_user
    redirect_back fallback_location: '/'
  end
  def downvote
    @link = Link.find(params[:id])
    @link.downvote_by current_user
    redirect_back fallback_location: '/'
  end

def comments
    @link = Link.find(params[:link_id])
      @link.comments.count
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_link
      @link = Link.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def link_params
      params.require(:link).permit(:title, :url, :image, :description, :tag_list, :address, :country, :city, :route, :street_number, :neighborhood)
    end
end

EDIT 2

Я редактировал несколько предыдущих абзацев.Теперь в раскрывающемся списке можно отобразить отличные значения из городов ссылок, и он перенаправит на отфильтрованную домашнюю страницу, но я хочу, чтобы города были отфильтрованы по раскрывающемуся списку стран.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...