Ruby on rails 需要帮助为Rails项目创建数据模型吗

Ruby on rails 需要帮助为Rails项目创建数据模型吗,ruby-on-rails,ruby,database,sqlite,rails-activerecord,Ruby On Rails,Ruby,Database,Sqlite,Rails Activerecord,我在Rails中有过一些自我项目的经验,在为这个特定场景创建数据模型时遇到了一些问题。基本上,有许多用户,每个用户都可以演奏许多乐器,对于每个用户/乐器配对,都有一定的技能水平 例如,Joe可以使用5级技能吹萨克斯管,使用2级技能吹单簧管,使用3级技能吹小号。鲍勃可以演奏技巧级别为1的长号、技巧级别为4的萨克斯管和技巧级别为5的单簧管 我知道如何使用传统SQL实现这一点,但我真的希望能够利用Rails ActiveRecord的功能(因此,理论上,我可以这样做: @users = User.al

我在Rails中有过一些自我项目的经验,在为这个特定场景创建数据模型时遇到了一些问题。基本上,有许多用户,每个用户都可以演奏许多乐器,对于每个用户/乐器配对,都有一定的技能水平

例如,Joe可以使用5级技能吹萨克斯管,使用2级技能吹单簧管,使用3级技能吹小号。鲍勃可以演奏技巧级别为1的长号、技巧级别为4的萨克斯管和技巧级别为5的单簧管

我知道如何使用传统SQL实现这一点,但我真的希望能够利用Rails ActiveRecord的功能(因此,理论上,我可以这样做:

@users = User.all
@users.each do |user|
  user.instruments do |ins|
  puts ins.level  #The current user's skill level on a particular instrument
  end
end

我如何创建迁移/模型来实现这一点?谢谢!

模型基本上是:

class User < ActiveRecord::Base
  has_many :instrument_skills
  has_many :instruments, through: :instrument_skills
end

class InstrumentSkill < ActiveRecord::Base
  belongs_to :instrument
end

class Instrument < ActiveRecord::Base
end
那么生成的迁移可能如下所示:

class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t| 
      t.string :name
      t.timestamps
    end 
  end 
end

class CreateInstruments < ActiveRecord::Migration
  def change
    create_table :instruments do |t| 
      t.string :name
      t.timestamps
    end 
  end 
end

class CreateInstrumentSkills < ActiveRecord::Migration
  def change
    create_table :instrument_skills do |t| 
      t.integer :user_id
      t.integer :instrument_id
      t.integer :level
      t.timestamps
    end 
  end 
end
class CreateUsers
我还需要创建一个单独的级别模型吗?你能解释一下“through”关键字的作用吗?这有点让人困惑……我的答案的DB设计与Rails无关。它是映射到表和关联的用例。用户有多种技能(如弹钢琴、鼓或其他)因此,通过技能(具有一定水平)也与多个乐器相关联。回到Rails:这就是为什么(用Rails的话来说)a通过关联有很多乐器。用户通过技能有很多乐器。Rails正是这样命名选项的:“through”。答案对你有帮助吗?
class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t| 
      t.string :name
      t.timestamps
    end 
  end 
end

class CreateInstruments < ActiveRecord::Migration
  def change
    create_table :instruments do |t| 
      t.string :name
      t.timestamps
    end 
  end 
end

class CreateInstrumentSkills < ActiveRecord::Migration
  def change
    create_table :instrument_skills do |t| 
      t.integer :user_id
      t.integer :instrument_id
      t.integer :level
      t.timestamps
    end 
  end 
end