我的设置:Rails 2.3.10,Ruby 1.8.7我应该在哪里放这段代码?
我需要更新事务模型的多个实例。我应该创建一个类方法并更新方法中的所有实例,还是应该将该逻辑移动到控制器并通过模型的实例方法更新每个实例?我想这是肥胖控制者与胖胖模型之间的权衡,一般建议是肥胖控制者的胖胖模型。
我的设置:Rails 2.3.10,Ruby 1.8.7我应该在哪里放这段代码?
我需要更新事务模型的多个实例。我应该创建一个类方法并更新方法中的所有实例,还是应该将该逻辑移动到控制器并通过模型的实例方法更新每个实例?我想这是肥胖控制者与胖胖模型之间的权衡,一般建议是肥胖控制者的胖胖模型。
也没有。如果这是一个重要的逻辑,为什么不把它整合到一个专门的课程?
另外,如果你的(我假设)形式的数据可以被这样配置:
params[:models] = { id_of_instance_1 => { :attribute => value },
id_of_instance_2 => { :attribute => value2 },
}
你可以很容易地做一组更新您的控制器:
Model.update(params[:models].keys, params[:models].values)
更多信息关于你正在更新的细节和他们来自哪里可能会有所帮助。
编辑:阅读以下你的回应......之后
有你能做到这一点的几种方法。您可以实现Model.win
和Model.lose
作为类方法纳入逻辑,则只需拨打您的控制器的方法:
def process_outcome
@winner = Model.win(params[:winning_id])
@loser = Model.lose(params[:losing_id])
end
或者,即使作为一个单一的方法调用:
def process_outcome
# passing the entire params hash to `process_outcome` which returns an array
@winner, @loser = Model.process_outcome(params)
end
就个人而言,如果只有涉及的子对象都是相同模型的实例,我会在类本身中实现这个逻辑。
但是,如果你把一个各种类混进去,它可能是值得的,封装到一个单独的对象干脆:
# app/controllers/models_controller.rb
def process_outcome
@outcome_processor = OutcomeProcessor.new(params)
@winner = @outcome_processor.winner
@loser = @outcome_processor.loser
end
无论哪种方式,您的实际事务块应该不是在控制器中。
我认为你应该遵循传统。 :) 您可以使用不同的类(不是控制器)来编写交易方法。
传统在脂肪模型?我想知道在我的情况下创建类方法是否有任何问题。 – Bob 2011-03-03 05:20:04
它应该几乎肯定会在模型中,而不是控制器。
我认为它应该在实例方法中,而不是类方法。我的理由是,你可能会通过URL /model/id/action?other_model_id=other_id
来调用它。然后,在控制器动作中,您将获得id
以及other_id
的适当模型实例,但由于这是id
模型的路径,而不是other_id
模型,因此可以将其称为@id_model.perform_action(@other_id_model)
。
希望这是有道理的。
其实我的需求有点复杂。这个调用是一个REST JSON调用,如你所指出的那样传递给2个用户标识(获胜者和失败者)。对于每个用户,我需要更新子模型实例的多个实例(多于2个),这就是我使用类方法的地方。希望这是有道理的。 – Bob 2011-03-03 05:26:30
嗯。那么你应该尽最大努力让它远离控制器。控制器只应该在模型和视图/请求之间传递数据所需的最低限度。请记住:[瘦控制器,胖模型](http://www.mikebernat.com/images/cake/layercake.png)。 – 2011-03-03 05:31:50
不幸的是,它并不是像你所建议的那样直接更新,但有一个专门的类可能是有道理的。 – Bob 2011-03-03 05:35:27
感谢您的详细解答。我所做的是按照你的建议调用一个类的方法,尽管值得考虑将它封装在一个单独的对象中。 – Bob 2011-03-03 05:46:00