parameter
parameter

Reputation: 904

Database organization for separating two different types of the same model

So I want my User model to have_many Skills. I want there to be two different categories for the skills: a wanted skill, and a possessed skill.

For example, a user can add a skill to their profile that they possess, such as HTML. They can also add a skill to their profile that they wish to learn, such as Ruby on Rails. On their profile it'll list their current skills and wanted ones, separately.

From a high level, what's the best way to architect this? I just want there to be 1 Skill model with no duplicates, but I want there to be a way for users to have the 2 separate groups of skills in the database.

Upvotes: 0

Views: 33

Answers (2)

usha
usha

Reputation: 29349

You can use single table inheritance

class Skill < ActiveRecord::Base
end

class WantedSkill < Skill
   belongs_to :user
end

class PossessesSkill < Skill
  belongs_to :user
end

Your skills table should have a column called type where the type of the skill will be stored.

WantedSkill.create(:name => "html")

Above will save the record in the skills table with type 'WantedSkill'. You can retrieve it by

WantedSkill.where(:name => "html").first

your user associations can be like

class User < ActiveRecord::Base
   has_many :wanted_skills
   has_many :possessed_skills
end

You can read documentation here

Upvotes: 1

Edu Lomeli
Edu Lomeli

Reputation: 2282

A way to achieve this, you need two skill fields like: wanted_skill and possessed_skill

So, in Ruby on Rails you can have many references (with different names) to the same model, you only need to declare which class corresponds using class_name in the references, e.g.:

class User < ActiveRecord::Base
  belongs_to :wanted_skill, class_name: 'Skill'
  belongs_to :possessed_skill, class_name: 'Skill'
end

Upvotes: 1

Related Questions