【问题标题】:Rails 4: how to implement a column with multiple elementsRails 4:如何实现具有多个元素的列
【发布时间】:2014-07-18 04:45:19
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • 我建议使用技能模型......它为您提供了轻松整理具有给定技能的所有用户的优势。
  • 打字员 == Skill.find_by_name("typing");打字员.用户
  • 您使用的是什么数据库系统? Nosql 解决方案很容易支持这一点,否则您可以在 Postgres 等一些数据库系统中存储数组或哈希。虽然我同意@SteveTurczyn 并使用不同的模型
  • 也许您可以试试这个:github.com/mbleigh/acts-as-taggable-on 它使用第二种方法(技能模型),但允许您将其用作第一种方法(字符串)

标签: ruby-on-rails ruby-on-rails-4 model-associations


【解决方案1】:

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

  • 您可以从一个/多个技能中轻松找到用户(使用序列化数组,这是一次大冒险)
  • 数据库中不同技能之间的更好标准:
    • 使用序列化数组,您无法真正控制区分大小写、拼写错误等。
    • 使用技能模型,您可以轻松实现类似搜索的方法(有点类似于 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

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

web_developpers = Skill.where(name: 'Web developper').first.users
johns_skills = User.where(name: 'John').first.skills

如果明天你的老板想让你添加“首选技能”或“最佳技能”之类的功能怎么办?或者只是一种对用户技能进行“排序”(设置层次结构)的方式?

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

User.first.skills.where(users_skills: { best: true })

【讨论】:

    【解决方案2】:

    你在使用 Postgresql 吗?

    然后你可以使用JSON data type

    我在这里写了一个问题和答案:

    Postgres JSON data type Rails query

    你可以有专栏skills

    其中的 JSON 为 {skills: [1,2,3,4]}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-07
      • 2021-05-29
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 2015-09-24
      • 1970-01-01
      相关资源
      最近更新 更多