У меня есть класс Target Market, который был засеян всеми странами мира, вот так

TargetMarket.create([
 {name: 'Andorra'},
 {name: 'United Arab Emirates'},
 {name: 'Afghanistan'},
 {name: 'Antigua and Barbuda'},
 ....
 ....
 {name: 'South Africa'},
 {name: 'Zambia'},
 {name: 'Zimbabwe'}
])

Затем пользователь может выбрать до 5 стран, которые он хочет использовать в качестве целевого рынка для своей компании.

На странице общедоступного поиска у меня есть раскрывающийся список всех TargetMarkets.

Текущий код читается как

<%= f.select :target_markets_id_in, TargetMarket.all.map{ |u| u.name, u.id] }, { include_blank: "All" }, {class: 'selectize-this', multiple: true} %>

Тем не менее, это, очевидно, показывает ВСЕ страны. Я хочу, чтобы только страны, которые использовались компанией в качестве целевого рынка, заполняли раскрывающийся список.

Например; Компания имеет целевые рынки «Ирландия», «Бельгия», «Австралия» и «Япония».

В параметре поиска target_markets я хочу, чтобы в качестве возможных вариантов поиска отображались только Ирландия, Бельгия, Австралия и Япония, поскольку они являются единственными странами, используемыми в базе данных.

Это возможно?

Что-то типа

<%= f.select target_market_ids_in, TargetMarkets.where('name' count >= 1) %> 

Редактировать #

Отношения

class Company < ApplicationRecord
 has_and_belongs_to_many :target_markets
 accepts_nested_attributes_for :target_markets, allow_destroy: true
end 
0
Brian O Halloran 14 Мар 2018 в 20:04

2 ответа

Лучший ответ

JOINing и DISTINCTing предоставят вам уникальный список объектов с ассоциациями. Это связано с тем, что по умолчанию Rails ActiveRecord объединяется с INNER JOIN, фильтры на наличие ассоциации. ActiveRecord по-прежнему будет содержать только SELECT столбцов из исходной таблицы, поэтому DISTINCT вернет уникальный список объектов.

В вашем случае вам нужно добавить ассоциацию habtm в TargetMarket, если она еще не существует:

class TargetMarket < ApplicationRecord
  has_and_belongs_to_many :companies
end

Затем замените эту строку:

TargetMarket.all.map{ |u| u.name, u.id] }

С участием:

TargetMarket.joins(:companies).distinct.map { |u| [u.name, u.id] }

Пока вы занимаетесь этим, вы можете взглянуть на результат

TargetMarket.joins(:companies).distinct.to_sql
1
Aaron Breckenridge 15 Мар 2018 в 13:15

Когда пользователь выбирает до 5 стран, которые он желает использовать в качестве целевого рынка для своей компании, сохраняете ли вы этот выбор как связь между Компанией и целевым рынком? Если вы это сделаете, то вы сможете вернуть только целевые рынки, связанные с текущей компанией.

class Company < ActiveRecord::Base
    has_many :target_markets
end

Добавление целевых рынков

@company.target_markets << TargetMarkets.find_by_name('Finland')

Отображение целевых рынков

# assuming `@company` is set based on the route (`/company/:id`), `current_user` settings, or however you determine what the current company is
<%= f.select :target_markets_id_in, @company.target_markets.map{ |u| u.name, u.id] }, { include_blank: "All" }, {class: 'selectize-this', multiple: true} %>

Дальнейшее чтение

0
alexanderbird 14 Мар 2018 в 17:23