【问题标题】:Should a model create instances of other models ever? - Rails MVC一个模型应该创建其他模型的实例吗? - 导轨 MVC
【发布时间】:2019-11-14 02:07:56
【问题描述】:

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

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

每个硬币翻转可以有 2 名玩家加入。当玩家加入投币时,我们创建投币参与者。我希望控制器在模型 coinflip.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 中,并从模​​型中删除 join 方法。

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

这给出了相同的结果,但是如果我想让另一个用户从另一个控制器加入,我必须在创建参与者之前实施相同的检查。这些解决方案中的任何一个是正确的还是有不同的解决方案?

【问题讨论】:

  • 经验法则:控制器用于在模型和视图之间或视图到模型之间移动数据。模型用于“业务逻辑”。过度填充控制器的时代已经一去不复返了。
  • 只是为了非常清楚。当你说“过度填充控制器的时代已经一去不复返了”时,你的意思是你应该像我的第一个例子一样在模型中保留尽可能多的逻辑,还是你不能再在控制器中放太多东西了?
  • 考虑使用服务。胖模特。脂肪控制器。脂肪就是脂肪。脂肪不好。
  • @TobiasKnudsen 我的意思是,在几年或更多年前,许多 Rails 开发人员都有不良习惯,会将逻辑塞进控制器中,而 MVC 则要求清晰明确地分离关注点。你的看法更正确。

标签: ruby-on-rails model-view-controller


【解决方案1】:

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

@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

现在,控制器实际上调用动作来加入您想要的两件事,并且与这两件事相关的实际模型负责。

【讨论】:

  • 感谢您的回答!我喜欢你的方法,我们可能会使用你的答案的变体。然而,讨论是关于你是否应该在模型中拥有一个创建不同模型实例的方法,或者这是否违反 MVC 设计模式的讨论是非常具体的。您能否详细说明您在该主题中的立场。
  • 我认为这个问题与 stackoverflow 无关,因为它有点过于基于意见。模型解耦很重要,它们之间的耦合越少越好。这并不意味着你不能有一个模型来创建另一个模型,如果它真的有意义的话。假设您有一个 User 模型和一个 Profile 模型,例如,我不会怀疑让用户创建配置文件对象。我不会说你不能这样做,这只是为了可维护性而不应过度使用的东西(也有像观察者模式这样的模式来消除这种耦合)
猜你喜欢
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-25
相关资源
最近更新 更多