Rails 4:如何实现具有多个元素的列

use*_*471 3 ruby-on-rails model-associations ruby-on-rails-4

我正在使用Ruby on Rails创建一个类似于LinkedIn的Web应用程序(rails 4),我正在尝试在User表中添加"技能"列.每个用户都可以拥有多种技能,我希望能够按技能对用户进行分类.

我可以将"技能"列设置为类型数组(确切地说是字符串数组),或者我可以拥有一个新的技能模型并进行关联(使用has_many).哪个会更好,还是有更好的解决方案?

谢谢!

MrY*_*iji 5

您绝对应该使用基于模型的技能解决方案而不是序列化数组或任何其他解决方案:

  • 您可以从一个/多个技能轻松找到用户(使用序列化数组,这是一个很大的冒险)
  • 数据库中不同技能之间的更好标准:
    • 使用序列化数组,您无法真正控制区分大小写,拼写错误等.
    • 使用技能模型,您可以轻松实现类似搜索的方法(类似于Stackoverflow如何处理关于您帖子的标签),为此目的已存在大量宝石

全局关系配置如下:

class User < ActiveRecord::Base
  has_many :users_skills
  has_many :skills, through: :users_skills

class UsersSkill < ActiveRecord::Base
  belongs_to :user
  belongs_to :skill
  validates :user_id, :skill_id, presence: true

class Skill < ActiveRecord::Base
  has_many :users_skills
  has_many :users, through: :users_skills
Run Code Online (Sandbox Code Playgroud)

有了这个,很容易从技能中找到用户,反之亦然:

web_developpers = Skill.where(name: 'Web developper').first.users
johns_skills = User.where(name: 'John').first.skills
Run Code Online (Sandbox Code Playgroud)

如果明天你的老板要你添加"首选技能"或"最佳技能"等功能怎么办?或者只是一种"订购"(设置层次结构)用户技能的方法?

只需best在连接表(users_skills)上添加一个布尔列

User.first.skills.where(users_skills: { best: true })
Run Code Online (Sandbox Code Playgroud)