用through构建关联代理

时间:2010-08-18 13:38:35

标签: ruby-on-rails

以本文为出发点:

Rails Way Blog - Association Proxies

并专门研究

def create
  @todo_list = current_user.todo_lists.build params[:todo_list]
  if @todo_list.save
    redirect_to todo_list_url(@todo_list)
  else
    render :action=>'new'
  end
end

这是确保您为用户分配所有权的一种方式

但是假设ToDo列表是has_many中关联的多对多关系,即

def User < AR:Base
  has_many :user_todos
  has_many :todo_lists, :through => :user_todos
end

此时......

@todo_list = current_user.todo_lists.build params[:todo_list]

仍然有效但只保存了todo_list而不是连接。如果连接或Todo实例在保存时不进行验证,如何在没有大量嵌套if / else的情况下获得关联代理的乐趣。

我正在考虑一些类似......的事情。

@todo_list = cu.user_todos.build.build_to_do(params[:todo_list])

但正如我上面提到的,user_todos不会被保存。

非常感谢您的帮助!

凯文。

2 个答案:

答案 0 :(得分:0)

尝试按照以下方式行事:

current_user.todo_lists << TodoList.new(params[:todo_list])

答案 1 :(得分:0)

我开始工作了......

起初我有:

@todo_list = @user.todo_lists.build params[:todo_list]
@todo_list.save!

当TodoList只是属于用户而不是多对多关系时,这是有效的。当我改变了我必须做的关系......

@todo_list = @user.todo_lists.build params[:todo_list]
@user.save!

这保存了@ user,join和@todo_list。

显然我想但是我想知道原始的例子是否也应该

current_user.save!

而不是

@todo_list.save!

我认为构建背后的想法是,当您保存父级时,它会验证并保存关联,因此Rails Way处的示例会错过这一点吗?或者更可能是我?