2015-02-02 2 views
-1

В моих рельсах IA приложений имеет модель работыRails: выбрать из нескольких моделей

belongs_to :company 
belongs_to :organization 

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

<%= f.text_field :company_name, data: {autocomplete_source: Company.order(:name).map(&:name) },required: true %>  

и это в моей модели работы

def company_name 
    company.try(:name) 
end 

def company_name=(name) 
    self.company = Company.where(name: name).first_or_create 
end 
+0

Положите логику в поле зрения плохой практики. –

ответ

0

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

<% companies_and_organizations = (Company.all.pluck(:name) + Organization.all.pluck(:name)).sort %> 
<%= f.text_field :company_name, data: {autocomplete_source: companies_and_organizations}, required: true %> 

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

def company_name 
    (company || organization).try(:name) 
end 

def company_name=(name) 
    company_or_organization = Organization.where(name: name).first 
    company_or_organization ||= Company.where(name: name).first_or_create 
    self.company = company_or_organization 
end 
+0

Да, нет никакой связи между организацией и компанией, это две разные модели. Я дам ваш код попробовать, но вы можете сказать мне, если запись не существует, она будет создана как компания или организация или и то, и другое? – userails

+0

Обратите внимание, что я отредактировал это (я пропустил '||' на 'where' проверяет). В коде я решил создать компанию, если запись не существует. Я не знаю, что вы предпочитаете делать; вы можете заменить предложения Организации/Компании 'where'. Просто убедитесь, что вы 'first_or_create' последний. – jwadsack

+0

Кроме того, на случай, если вы задаетесь вопросом: '.pluck (: name)' похоже на '.map (&: name)' (который вы использовали), за исключением того, что он возвращает только одно поле из базы данных, а не загружает каждую запись и создание объекта. Так что небольшое улучшение производительности, если у вас много компаний или организаций. – jwadsack

Смежные вопросы