将 MODEL_id 传递给另一个模型参数

Posted

技术标签:

【中文标题】将 MODEL_id 传递给另一个模型参数【英文标题】:Pass in MODEL_id to another model params 【发布时间】:2021-10-06 08:16:15 【问题描述】:

我有两个模型:游戏和作业。当我创建一个游戏时,我想自动创建一个与该游戏一起使用的作业,从而建立两者之间的关联。在我的游戏控制器中,我有:

def create
    @game = Game.new(game_params)
    @assignment = Assignment.new(assignment_params)

    respond_to do |format|
      if @game.save
        format.html  redirect_to @game, notice: "Game was successfully created." 
        format.json  render :show, status: :created, location: @game 
      else
        format.html  render :new, status: :unprocessable_entity 
        format.json  render json: @game.errors, status: :unprocessable_entity 
      end
    end
  end

private
   def game_params
      params.require(:game).permit(:home_team, :away_team)
    end

    def assignment_params
      params.require(:assignment).permit(@game.game_id)
    end
end

创建游戏时如何将 game_id 传递给分配参数?我的模型如下以防需要。我的分配模型中有一个game_id 列。

class Game < ApplicationRecord
    has_one :assignment, dependent: :destroy
    has_many :users, through: :assignments
end

class Assignment < ApplicationRecord
    belongs_to :game

    belongs_to :center_referee, class_name: 'User', foreign_key: "user_id"
    belongs_to :assistant_referee_1, class_name: 'User', foreign_key: "user_id"
    belongs_to :assistant_referee_2, class_name: 'User', foreign_key: "user_id"
end

游戏形式


<%= simple_form_for(@game) do |f| %>
  <%= f.error_notification %>
  <%= f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present? %>

  <div class="form-inputs">
    <%= f.input :home_team %>
    <%= f.input :away_team %>
  </div>

  <div class="form-actions">
    <%= f.button :submit %>
  </div>
<% end %>

游戏控制器

def new
    @game = Game.new
  end

  # POST /games or /games.json
  def create
    @game = Game.new(game_params)

    respond_to do |format|
      if @game.save
        format.html  redirect_to @game, notice: "Game was successfully created." 
        format.json  render :show, status: :created, location: @game 
      else
        format.html  render :new, status: :unprocessable_entity 
        format.json  render json: @game.errors, status: :unprocessable_entity 
      end
    end
  end

【问题讨论】:

如果你总是在游戏中创建任务,你可以在游戏模型中进行,不需要给控制器增加负担。查看嵌套属性。 你的表单是什么样子的? 上面添加了游戏表格。我已将 create_assignment 移至 Game 模型 【参考方案1】:

在我的脑海中,您可以简单地在 Game 模型中运行一个简单的回调,如下所示:

after_create :create_assignment    

def create_assignment
  Assignment.create(game_id: id, center_referee_id: , assistant_referee_1_id:, assistant_referee_2_id:)
end

这样您就可以在模型级别处理一次。每个创建的游戏都会自动创建一个任务。

此外,如果不需要referees,您可以将optional: true 标志传递给assignment 模型中的belongs_to。这样您就可以安全地创建游戏。因为目前还不清楚你是如何从裁判那里获得详细信息的。

【讨论】:

所以除了未创建作业外,它运行良好。在我得到的日志中:Game Load (1.2ms) SELECT "games".* FROM "games" WHERE "games"."id" = $1 LIMIT $2 [["id", 16], ["LIMIT", 1]] ↳ app/models/game.rb:10:in `create_assignment' TRANSACTION (1.0ms) COMMIT ↳ app/controllers/games_controller.rb:27:in `block in create' 不确定“block in create”是什么意思 嗯,它在您的games_controller 的第 27 行给出了提示,您能分享一下那里的内容吗?或者可能将after_create 更改为after_save 是的,我认为它没有保存,因为它belongs_to 其他裁判也是。所以我们可能不得不改变实现。 我注释掉了其他3个属于和成功。现在我需要再次弄清楚 belongs_to :user 的东西。如果您想了解我关于其他问题的问题,请点击此处链接:***.com/questions/68569165/…

以上是关于将 MODEL_id 传递给另一个模型参数的主要内容,如果未能解决你的问题,请参考以下文章

如何将带有参数的 Meteor Spacebars 助手传递给另一个助手属性?

在保存以将该模型与当前用户相关联之前,在 Python 中将当前用户的 id 传递给另一个模型

如何将关键部分传递给另一个线程?

将变量传递给另一个页面上的函数

是否可以将一个方法传递给另一个方法? [复制]

如何将一个反应组件传递给另一个反应组件以包含第一个组件的内容?