Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 胖模型,瘦控制器-但是如果混合模型呢?_Ruby On Rails_Oop - Fatal编程技术网

Ruby on rails 胖模型,瘦控制器-但是如果混合模型呢?

Ruby on rails 胖模型,瘦控制器-但是如果混合模型呢?,ruby-on-rails,oop,Ruby On Rails,Oop,我正在构建一个Ruby on Rails 4.1应用程序,该应用程序具有以下模型,当您看到模型名称时,这些模型应该是有意义的: 域、团队、用户、会议等 现在,团队属于域,用户属于团队,会议也属于用户。域就是使用该软件的组织或公司 创建管理员用户后,该用户必须首先创建域,然后创建第一个团队,然后其他用户可以注册 正如您可能预期的那样,在创建初始域和团队的过程中(在团队和域控制器的新建/创建中完成),我必须访问和更改所有三个域和团队中的引用。因此,例如,创建第一个域必须与管理员用户关联,创建团队需要

我正在构建一个Ruby on Rails 4.1应用程序,该应用程序具有以下模型,当您看到模型名称时,这些模型应该是有意义的:

域、团队、用户、会议等

现在,团队属于域,用户属于团队,会议也属于用户。域就是使用该软件的组织或公司

创建管理员用户后,该用户必须首先创建域,然后创建第一个团队,然后其他用户可以注册

正如您可能预期的那样,在创建初始域和团队的过程中(在团队和域控制器的新建/创建中完成),我必须访问和更改所有三个域和团队中的引用。因此,例如,创建第一个域必须与管理员用户关联,创建团队需要将其链接到用户,然后链接到父域

所以,这一切都变得有点混乱,控制器需要访问几个模型

我的问题是,这种逻辑属于哪里?本着瘦控制器的精神,您通常会将其分配给模型,但它涉及多个模型。这就是新的Rails 4关注点变得有用的地方,还是我应该把它放在控制器中

我对rails比较陌生,所以如果您愿意回复,请记住这一点-谢谢

嵌套资源 然后在控制器中:

class TeamsController < ApplicationController

  def new
    @team = Team.new
  end

  def create
    @domain = Domain.find(params[:domain_id])
    @team   = @domain.teams.build(params[:team])
    @team.save

    respond_with @team
  end

end
URL将如下所示:

/domains/:domain_id/teams
/domains/:domain_id/teams/:team_id
同样的逻辑也适用于其他型号。这将为您构建应用程序提供一个起点

下一行

@domain.teams.build(params[:team])
自动将域链接到为您设置引用(
id
)的团队

但是,您不应该根据需要进行深度嵌套,这样构建器设计模式就可以派上用场了

构建器设计模式 然而,如果事情开始变得一团糟,我建议使用一个专用的ruby类来“构建”对象及其关系。我们通常将这些类称为“构建器”:

在这里,它再次执行非常简单的任务。对于用户和会议,例如:

class UserBuilder

  attr_reader :team, :params

  def initialize(team, params = {})
    @team = team
    @params = params
  end

  def build
    team.users.build(params).tap do |user|
      user.foo = 'foo'
      user.meetings.build(...)
      user.meetings << MeetingBuilder.new(user, { ... })
    end
  end

end

class MeetingBuilder
  # ...
end
嵌套资源 然后在控制器中:

class TeamsController < ApplicationController

  def new
    @team = Team.new
  end

  def create
    @domain = Domain.find(params[:domain_id])
    @team   = @domain.teams.build(params[:team])
    @team.save

    respond_with @team
  end

end
URL将如下所示:

/domains/:domain_id/teams
/domains/:domain_id/teams/:team_id
同样的逻辑也适用于其他型号。这将为您构建应用程序提供一个起点

下一行

@domain.teams.build(params[:team])
自动将域链接到为您设置引用(
id
)的团队

但是,您不应该根据需要进行深度嵌套,这样构建器设计模式就可以派上用场了

构建器设计模式 然而,如果事情开始变得一团糟,我建议使用一个专用的ruby类来“构建”对象及其关系。我们通常将这些类称为“构建器”:

在这里,它再次执行非常简单的任务。对于用户和会议,例如:

class UserBuilder

  attr_reader :team, :params

  def initialize(team, params = {})
    @team = team
    @params = params
  end

  def build
    team.users.build(params).tap do |user|
      user.foo = 'foo'
      user.meetings.build(...)
      user.meetings << MeetingBuilder.new(user, { ... })
    end
  end

end

class MeetingBuilder
  # ...
end

理想情况下,模型不应该关心,甚至不应该知道其他类。所以在模型和控制器之间,这种逻辑肯定属于控制器

不过,我可能会选择第三类,处理那些乱七八糟的东西,比如DomainFactory。它只是一个普通的旧ruby对象(poro),没有活动记录或任何东西,其唯一目的是创建域


一个技巧是阅读松散耦合和单一责任。

理想情况下,模型不应该关心,甚至不应该知道其他类。所以在模型和控制器之间,这种逻辑肯定属于控制器

不过,我可能会选择第三类,处理那些乱七八糟的东西,比如DomainFactory。它只是一个普通的旧ruby对象(poro),没有活动记录或任何东西,其唯一目的是创建域


一个技巧是阅读松散耦合和单一责任。

这是我考虑做的事情-时间再考虑一下。我要花几个小时来评估这个-谢谢Pierre。不过你会把它放在多远的地方?用户似乎也适合这个嵌套,但我现在记得我的问题是什么。我还有大约5个其他类(建筑、房间、出勤、预订、检查),它们也是相互关联的,当我查看嵌套时,我认为我可能会得到太多的嵌套资源。但是,我看到你停在一个深处。你能说这是一个深思熟虑的选择吗?谢谢是的,你应该避免深度嵌套,看看这里,我认为builder选项是一个更好的选项,因为路由太复杂了,我认为即使仔细嵌套,考虑到相互交互的类的数量。谢谢你的回答,我会接受的。你会把构建器类放在Rails 4目录结构的什么地方?担心是分裂模型/控制器-所以,也许在助手目录?这是我认为做的事情-时间再考虑它。我要花几个小时来评估这个-谢谢Pierre。不过你会把它放在多远的地方?用户似乎也适合这个嵌套,但我现在记得我的问题是什么。我还有大约5个其他类(建筑、房间、出勤、预订、检查),它们也是相互关联的,当我查看嵌套时,我认为我可能会得到太多的嵌套资源。但是,我看到你停在一个深处。你能说这是一个深思熟虑的选择吗?谢谢是的,你应该避免深度嵌套,看看这里,我认为builder选项是一个更好的选项,因为路由太复杂了,我认为即使仔细嵌套,考虑到相互交互的类的数量。谢谢你的回答,我会接受的。你会把构建器类放在Rails 4目录结构的什么地方?关注点是分离模型/控制器-那么,可能在助手目录中?