需要帮助为Rails项目创建数据模型

时间:2015-08-18 05:18:52

标签: ruby-on-rails ruby database sqlite rails-activerecord

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

例如,Joe可以演奏技能等级为5的萨克斯,技能等级为2的单簧管和技能等级为3的小号.Bob可以演奏技能等级为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

如何创建迁移/模型来实现此目标?谢谢!

1 个答案:

答案 0 :(得分:2)

模型基本上是:

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

表示你可以创建像::

这样的模型
rails g model User name:string
rails g model InstrumentSkill instrument_id:integer user_id:integer level:integer
rails g model Instrument name:string

然后您生成的迁移可能如下所示:

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