2016-08-13 53 views
0

我有一个模型:“事件”,它有一个控制器:“event_controllerRuby on Rails的:什么是惯例(?有一个),用于创建模型实例编程

event_controller处理以下路线:事件/:ID/complete_event

在控制器中,我需要触发建立在系统中的其他几个模型对象,这是计算,而不是通过网络的形式输入。

在这种情况下,模型创建有:

  1. 得分(其belongs_to的:用户事件
  2. 统计(其belongs_to的:事件
  3. 站立(其中belongs_to:用户 |并基于新得分/统计对象)

,这是什么类型的模型创造了Ruby on Rails的约定?

对于event_controller可以创建这些(有点无关的)模型对象吗?

,或者

如若event_controller呼叫到score_controllerstats_controllerstanding_controller

第二个选项,我担心它不能在链中分配2-3个路由来在其相应的控制器中创建所有对象,但这是惯例。

在最后,它是理想的,将用户重定向回show_event视图,它会显示事件及其相关分数统计对象。

代码为event_controller方法:complete_event

def complete_event 
    event = Event.find(params[:id]) 
    if event.in_progress? 
    event.complete! 
    end 
    # 1. create score for each user in event.users 
    # 2. create stats for the event 
    # 3. update the overall standings for each score (per user) 
    redirect_to event 
end 

正如你所看到的,事件是不是被创造的这个动作,而事件状态更新为“完整的”,这是触发创建关联的记录。上述

注释行代表什么,我需要做的事件后完成;我只是不知道这是我继续前进,直接创建对象。

E.g.要创建得分我将不得不计算大量启动事件,但使用很多模型来获取所有的相关数据来创建它的数据。

+1

是,控制器可以创造任何他们想要的车型。没有什么阻止他们这样做。他们不能直接调用其他控制器。只能间接地通过'redirect_to'或其他东西。我建议你阅读更多的导轨指南/教程。显然,这些概念在你的脑海中仍然有点模糊。 –

+0

我认为这不应该在控制器中完成。相反,你的控制器可以调用一个Builder,它可以在一个方法中创建所有相关和相关的对象或者您的事件模型可以在创建时自己生成所有需要的耦合对象。或者,当您第一次访问它们时,它可能会创建它们。 – spickermann

+0

@SergioTulentsev我已经研究过Rails指南并且一直在关注几个教程;但没有一个真正强调或解决这个特定的情况。如果您有任何有用的参考链接。 – dannbeau

回答

0

您可以将整个逻辑控制器出来,这样我可以当你调用even.completed明白了!您需要为用户创建分数并更新整个评分。因此,请在模型after_update is_event_completed中添加回调!假设evet.com已完成!将在db级别标记事件完成。然后,将相应的逻辑放入模型中。将业务逻辑放入模型是最佳实践。这是管理模型github.com/pluginaweek/state_machine的状态以及针对特定事件做具体事情的好宝石。

+0

你可以将整个逻辑移出控制器,所以当你打电话给even.completed时我​​能理解!您需要为用户创建分数并更新整个评分。因此,请在模型after_update is_event_completed中添加回调!假设evet.com已完成!将在db级别标记事件完成。然后,将相应的逻辑放入模型中。将业务逻辑放入模型是最佳实践。这是管理模型https://github.com/pluginaweek/state_machine的状态以及在特定事件上执行特定事情的好材料。 –

+0

感谢Muaaz Rafi,我已经编辑了这个问题以包含状态更新的代码。 – dannbeau

0

这种感觉对我来说,所有的步骤都完成的事件的一部分,因此,我认为它属于到Event#complete!方法。

# in the controller 
def complete_event 
    event = Event.find(params[:id]) 
    event.complete! if event.in_progress? 
    redirect_to event 
end 

# in the model 
def complete! 
    # complete event 

    # 1. create score for each user in event.users 
    # 2. create stats for the event 
    # 3. update the overall standings for each score (per user) 
end 

或者你可以使用执行完成一个小的Ruby类:

# in the controller 
def complete_event 
    event = Event.find(params[:id]) 
    EventCompleter.new(event).perform 
    redirect_to event 
end 

# in models/event_completer.rb 
class EventCompleter < Struct.new(:event) 
    def perform 
    event.complete! 

    # 1. create score for each user in event.users 
    # 2. create stats for the event 
    # 3. update the overall standings for each score (per user) 
    end 
end 

第二似乎对这个简单的例子有点太复杂,但对于更复杂的任务一个有趣的模式。主要的好处是,这个简单的Ruby类封装了完成一个事件时所需要完成的所有业务和领域逻辑(这个逻辑并不属于事件)。而且它更容易测试。

相关问题