一个模型应该创建其他模型的实例吗?-Rails MVC



我正在和我的一位编程朋友讨论一个模型是否应该能够创建其他模型。我们目前正试图创建一个网站,让人们可以在这里互相对抗。假设我们有一个硬币翻转。这是我的CoinFlipController 的一个示例

class CoinFlipsController < ApplicationController
def join
coinflip = CoinFlip.find(params[:id])
participant = coinflip.join(current_user)
end
end

每个coinflicp可以有2名玩家加入。当玩家加入一个coinflic时,我们会创建一个conflic参与者。我希望控制器在模型coinflicp.join(current_user(.上调用join

class CoinFlip < ApplicationRecord
def join(user)
if self.coin_flip_participants.count < 2
participant = CoinFlipParticipant.create(coin_flip: self, user: user, client_seed: user.client_seed, face: :t)
else
raise CoinFlipFull.new("Coin Flip Full")
end
end

然而,我的朋友希望我像这样将逻辑放入CoinFlipController中,并从模型中删除联接方法。

class CoinFlipsController < ApplicationController
def join
@coinflip = CoinFlip.find(params[:id])
if @coinflip.coin_flip_participants.count < 2
@participant = CoinFlipParticipant.create(coin_flip: @coinflip, user: current_user, client_seed: current_user.client_seed, face: :t)
else
raise CoinFlipFull.new("Coin Flip Full")
end
end

这会得到相同的结果,但是,如果我想让另一个用户从另一个控制器加入,我必须在创建参与者之前实现相同的检查。这两种解决方案是正确的还是有不同的解决方案?

我认为问题在于您的操作被称为联接,因此它应该以实际的联接模型为中心。我的意思是,就我个人而言,我会这样做:

@coinflip = CoinFlip.find(params[:id])
@participant = CoinFlipParticipant.join(current_user, @coinflip)
raise CoinFlipFull.new('Coin Flip Full') unless @participant

然后在CoinFlipParticipant 上定义一个方法

def self.join(user, coinflip)
return if coinflip.coin_flip_participants.count < 2
create(coin_flip: coinflip, user: user, client_seed: user.client_seed, face: :t)
end

现在,控制器实际上调用操作来连接您想要的两件事,而与这两件事相关的实际模型对此负责。

最新更新