2010-08-18 62 views
0

以这篇文章为出发点的代理:建筑协会通过

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列表是一个多关系的关联通过即

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

在这一点上的has_many ......

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

仍然有效,但只有todo_list被保存,而不是加入。如何在没有嵌套if/else的情况下获得联合代理的喜悦?如果联接或Todo实例未保存,则无法验证。

我在想沿着线的东西...

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

,但正如我在user_todos上面提到的没有得到保存。

非常感谢您的帮助!

Kevin。

+0

你在说'User#todo_lists'和'User#todos',但这些是你调整结构后的两个不同的东西。重命名应该会破坏一切。 – tadman 2010-08-18 13:47:53

+0

啊,我会改变这一点。它仍然不会保存连接! :) – 2010-08-18 14:12:34

回答

0

我得到它的工作...

起初我:

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

这工作时TodoList的简单belongs_to的用户,但而不是当它是多对多的关系时。当我改变了我不得不做的...

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

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

明显的,我想,但后来我想,如果最初的例子应该也

current_user.save! 

,而不是

@todo_list.save! 

我想后面构建的想法是,它验证并保存关联时你保存父母,那么Rails Way的例子会错过这一点吗?或更可能是我?

0

尝试做线沿线的东西:

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

谢谢马特。我从来没有真正理解过构建和你在这里所做的事情之间的区别。不知道这是否是一个好的答案!:)但感谢让我看着它不同。 – 2010-08-19 08:58:55

+0

再想一想 - 我猜build可以让你将新的ToDoList实例分配给一行中的变量。无需做: @todo_list = ToDoList.new(params [:todo_list]) current_user.todo_lists << @todo_list – 2010-08-19 09:10:55