2017-06-05 82 views
0

考慮以下兩種模式:Rails 5,如何用關聯表來命名兩個模型?

ChefPosition (Executive, Sous, etc...) 
Skills (Creativity, speed, quality) 

我正在創建一個定義技能每ChefPosition定義了哪些表。到目前爲止,我有:

ChefPositionSkill (chef_position_id, skill_id) 

在Rails 5的世界裏,我是否正確地命名模型?如果是這樣,這將是命名控制器返回每ChefPosition的技能,像正確的做法:

ChefPositionSkillController < ApplicationController 

    def index 
    @ChefPositionSkills = Skill.where(:chef_position => params[:chef_position_id] 
    render json: @ChefPositionSkills, status: status 
    end 
end 

這是正確的?智慧表示讚賞!謝謝

+2

如果你建立的has_many通過模型'ChefPositionSkill'該型號的控制器將成爲'ChefPositionSkillsController' –

+0

你推薦哪個?什麼是正確的Rails方式來做到這一點? – AnApprentice

+2

如果你需要@ bkunzi01所說的關聯關係的具體信息(即技能等級或分數),請[has_many through](http://guides.rubyonrails.org/association_basics.html#the-has-many-through -association )。如果它只是一個簡單的關聯(除了它們相關的事實外沒有其他信息),請執行[HABTM關聯](http://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to -many關聯)。如果它是一個HABTM協會,模型/控制器不是必要的,只需要DB表 –

回答

3

的約定可以採取習慣一段時間,這將有利於你,但一般:

你將有以下表和外鍵(複數):

chef_positions 
* id 
* name 
* ... 

skills 
* id 
* name 
* ... 

chef_position_skills 
* id 
* chef_position_id 
* skill_id 

然後,你可以與他們關聯的每個表定義模型(單數):

class ChefPosition < ApplicationRecord 
    has_many :chef_position_skills 
    has_many :skills, through: :chef_position_skills 
end 

class Skill < ApplicationRecord 
    has_many :chef_position_skills 
    has_many :chef_positions, through: :chef_position_skills 
end 

class ChefPositionSkill < ApplicationRecord 
    belongs_to :chef_position 
    belongs_to :skill 
end 

如果你想端點訪問所有的廚師地位技能給定的位置,你可能會在config/routes.rb創建嵌套路線:

resources :chef_positions, only: [] do 
    resources :chef_position_skills, only: [:index] 
end 

這將在/chef_positions/:chef_position_id/chef_position_skills定義路由。

然後,你可以創建一個控制器(複數)找到給出一個廚師位置的廚師技能位置列表:

class ChefPositionSkillsController < ApplicationController 
    def index 
    chef_position = ChefPosition.find(params[:chef_position_id]) 
    render json: chef_position.chef_position_skills 
    end 
end 
+0

INDEX是一種正確的方法,因爲它需要一個參數? – AnApprentice

+2

@AnApprentice yes,但參數是嵌套路由路徑的一部分。 'subdomain.domain.com/chef_positions/41/chef_position_skills' 會用'41'填充'params [:chef_position_id]'' –

2

首先跳到我的是「ChefPositionSkillController」應該複數遵循Rails慣例,所以應該是「ChefPositionSkillsController」。此外,如果您只是計劃將ChefPositions和Skills與多對多關聯起來,那麼您可以很好地命名連接表ChefPositionSkill(請記住,您可以更改該連接表,但連接表必須是兩個表中的組合名稱詞彙順序,這是你在這裏)。然而,大多數人現在使用「has_many through」關係,因爲您可以將其他細節添加到連接表中,而不僅限於id列。如果你決定一名廚師,具有一定的技能,也應該有一個等級或優先級等

+0

謝謝,這是非常有幫助的..對控制器的任何反饋...是否應該使用索引方法返回每個職位的所有技能? – AnApprentice

+1

是的,這是有道理的。 – bkunzi01