2017-06-05 33 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