У меня есть класс TargetMarket, в который были засеяны все страны мира, вот так
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
Компания has_and_belongs_to_many: target_markets





Когда пользователь выбирает до 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} %>
TargetMarket в семени, вы не должны повторно связывать их create при их связывании, вы должны найти их в базе данных и связать найденные записи.JOINing и DISTINCTing предоставят вам уникальный список объектов с ассоциациями. Это связано с тем, что ActiveRecord присоединиться Rails по умолчанию - это 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
Спасибо! Работает как шарм.
Какие точные ассоциации определены в моделях TargetMarket и Company (например, has_many, own_to)?