2016-06-23 4 views
0

Я создаю приложение, которое будет иметь несколько отношений много. Вот один пример: у пользователя приложения будет несколько навыков. В то же время многие job_posts будут обладать несколькими навыками. Я хотел бы, чтобы иметь возможность повторно использовать модели навыков, чтобы я мог иметь что-то вроде этого:Несколько Rails для многих отношений

User----has_many----->Skill(smart)<---has_many----job_posting 
          ^
           | 
          has_many 
           | 
          Application 

Таким образом, вы видите, я хочу быть в основном в состоянии создать один навык (в данном примере: «умный») , а затем ссылаются на это умение из нескольких разных моделей, используя has_many отношения.

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

В конце концов, было бы неплохо, чтобы иметь возможность сделать что-то вроде этого: myUser.skills.add (Skill.find (1)) myCompany.skills.add (Skill.find (1)). ..

PS Я знаю, что нет такой вещи, как skills.add(). Пожалуйста, предложите, что я мог бы использовать, если у вас есть что-то конструктивное. Спасибо :)

P.P.S Я использую MySQL в моей базе данных

+0

Вам нужно будет настроить таблицу БД для хранения информации о взаимоотношениях. Посмотрите на использование 'has_many: through' –

+0

hmm, это то, чего я надеялся избежать: /, тем более, что мне нужно было бы создать один для каждого типа отношений для каждой настройки, как это – Silvertail

+0

Как еще вы думаете, что это можно сделать? Вы * можете * взять неэффективный маршрут и избегать таблиц отношений, добавляя внешние ключи по всему месту. –

ответ

1

Я думаю, что это типичный пример полиморфного association.You можно проверить соответствующую документацию here в разделе 2.9. В вашем случае вы можете использовать

class Skill < ActiveRecord::Base 
    belongs_to :skillable, polymorphic: true 
end 

class User < ActiveRecord::Base 
    has_many :skills, as: :skillable 
end 

class JobPosting< ActiveRecord::Base 
    has_many :skills, as: :skillable 
end 
+0

Удивительный! Я думаю, что я должен использовать это и просто добавить метод к навыку, чтобы позволить мне создать хэш из объекта, чтобы я мог делать что-то вроде user.skills.create (Skill.find (1) .hashify()) – Silvertail

+1

Вы можете добавить умение к своим моделям как этот user.skills << Skill.find (1) – geoandri

+0

Это потрясающе! Я думаю, что это позволяет мне обойтись только с одним истинным отношением ко многим! Ты настоящий спасатель! Кстати, вы знаете, что это делает в фоновом режиме? Как db отслеживает это? – Silvertail

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