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