2017-07-31 43 views
0

我是Rails的新手。目前我正在开发Rails 5 API。将多个外键保存在一个模型属性中

有两种模式。

BLOCK 
block_name 
-------------------------------- 
EMPLOYEE 
name 
email 
block_ids (string) 

关系

Employee 
has_many: blocks 

Block 
belongs_to: user 

雇员控制块。当用户创建员工时,他必须指定该员工所控制的块。

这是帖子请求的主体。

{ 
    "first_name":"John", 
    "last_name": "Smith", 
    "email": "[email protected]", 
    "block_ids": "9,5,3" 
} 

所以约翰史密斯控制的ID块等于9,5和3.我想这种方法是不好的。

这是用户控制器创建行动

def create 
    @user = current_organization.employees.build(user_params) 
    if @user.save! 
    render json: @user 
    else 
    head :unprocessable_entity 
    end 
end 

如何外键有效地存储到多少块?你会建议我什么?

+0

你想让一个块只属于一个用户吗?或者可以将一个块与多个用户关联? –

+0

一个块可以关联到许多用户 –

回答

1

如果您拥有1xn关系(一名员工有很多块),则不应在员工上使用block_ids。您应该在block模型上使用employee_id。然后在block.rb上添加belongs_to :employee

但是,如果它是一个nxn关系(多对多),你必须创建另一种模式来做到这一点关系,就像EmployeeBlock,其中有employee_idblock_id。是这样的:

class EmployeeBlock < ApplicationRecord 
    belongs_to :employee 
    belongs_to :block 
end 

,并在你的employee.rb,是这样的:

has_many :employee_blocks 
has_many :blocks, through: employee_blocks 

,反之亦然为block.rb。

UPDATE: 用于创建n×n的关系表,就可以生成模式是这样的:

rails g model EmployeeBlock employee:references block:references 

这样的话,它会创建表的外键和belongs_to的关系。

对于表格,对于您的情况,我认为使用嵌套关联为您的用户提供表单是合理的。这有点复杂,所以我建议看看这个例子,认为它会说清楚: http://www.createdbypete.com/articles/working-with-nested-forms-and-a-many-to-many-association-in-rails-4/

+0

感谢罗南的答案。如果我使用nxn,那会更好。但是,我应该如何制定一个良好的岗位要求,以便了解哪些员工可以控制哪些方面? –

+0

我应该为EmployeeBlock模型进行迁移吗? –

+0

@ZhunissaliShanabek用更多的信息更新了这个问题。祝你好运! –