嵌套资源
class Domain
has_many :teams
end
class Team
has_many :users
belongs_to :domain
end
class User
has_many :meetings
belongs_to :team
end
class Meeting
belongs_to :user
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
这就是我们所说的“嵌套”控制器,在 routes.rb 文件中:
resources :domain do
resources :team
end
网址将如下所示:
/domains/:domain_id/teams
/domains/:domain_id/teams/:team_id
同样的逻辑适用于其他模型。这应该为您提供构建应用程序的起点。
下面一行
@domain.teams.build(params[:team])
自动将域链接到为您设置参考 (id) 的团队。
但是,您不应该根据rails guide 进行深度嵌套,因此构建器设计模式可以派上用场。
建造者设计模式
但是,如果事情开始变得混乱,我建议使用专用的 ruby 类来“构建”您的对象及其关系。我们通常将这些类称为“Builder”:
class TeamBuilder
attr_reader :domain, :params
def initialize(domain, params = {})
@domain = domain
@params = params
end
def build
domain.teams.build(params)
end
end
它又在做非常简单的任务。例如,对于用户和会议:
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
这里我们使用UserBuilder 中的MeetingBuilder 来建立会议。
用法:
user = UserBuilder.new(team, { ... }).build
user.save