【问题标题】:Save multiple foreign keys in one model attribute在一个模型属性中保存多个外键
【发布时间】:2017-07-31 20:22:10
【问题描述】:

我是 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": "smith@gmail.com",
    "block_ids": "9,5,3"
}

所以 John Smith 控制了 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

如何有效地将外键存储到多个块中?你有什么建议?

【问题讨论】:

  • 你想让一个块只属于一个用户吗?还是一个区块可以关联多个用户?
  • 一个区块可以关联多个用户

标签: ruby-on-rails json api rails-activerecord


【解决方案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 反之亦然。

更新: 要创建该 nxn 关系表,您可以像这样生成模型:

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/

【讨论】:

  • 感谢罗南的回答。如果我使用 nxn 会更好。但是我应该如何制作一个好的帖子请求,以便了解哪些阻止了员工控制?
  • 我应该为 EmployeeBlock 模型进行迁移吗?
  • @ZhunissaliShanabek 用更多信息更新了这个问题。祝你好运!
猜你喜欢
  • 2019-03-18
  • 1970-01-01
  • 2021-11-26
  • 2020-09-01
  • 2015-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
相关资源
最近更新 更多