我有两个模特:
Student > belongs_to Locker
Locker > has_one Student有了这个协会,我就得去储物柜给它分配一个学生,或者如果我要改变这个协会,我可以去找学生,给他分配一个储物柜。
这才是可行的,我也明白。但是,目前我的设置如下所述。
现在,当然,有一个想法,这将是超级酷,直接分配一个储物柜给一个学生,我正在创建(新学生)。
因此,在这种情况下,我确实有储物柜,但学生目前不在场,当它被创建时,从储物柜到这个学生的联系也应该被创建。因此,实际上会创建一个ID XXX的新学生,但同时这个ID也应该转到一个储物柜及其student_id属性。
我绞尽脑汁如何处理这个问题,因为我发现这些选项并没有真正做到这一点(我正在使用simple_form ):-使用关联- accepts_nested_attributes
唯一的办法,我看到它以某种方式发送假身份证(attr_accesor)选定的储物柜id到学生模型,创建学生,写下它的id,找到储物柜,更新这个新的id。
但这感觉又奇怪又不对。
有人能给我指明正确的方向吗?
发布于 2014-01-21 09:10:08
如果您的关联配置正确,那么您的学生表中就有一个:locker_id,因此您可以简单地在新的学生表单上有一个选择框。
<% form_for @student do |form| %>
<%= form.input :name %> # etc...
<%= form.collection_select(:locker_id, @unassigned_lockers, :id, :name) %>
<%= form.submit %>
<% end %>这是一个非常简单和标准的案例,除非你没有告诉我们一些事情。
注意,我已经抛出了一个@unassigned_lockers对象,而不是执行Locker.all,因为您可能希望在这里有一些逻辑,在下拉列表中只显示未分配的储物柜。
由于您还没有按照最初描述的方式设置您的关系,所以如果不手动处理,您就不能向学生提交:locker_id。作为一个快速建议:
<% form_for @student do |form| %>
<%= form.input :name %> # etc...
<%= collection_select_tag(:locker_id, @unassigned_lockers, :id, :name) %>
<%= form.submit %>
<% end %>select标记现在将在params中单独通过,您将需要修改您的create方法以找到储物柜并更新其学生id:
def create
@student = Student.new(params[:student])
if @student.save
Locker.find(params[:locker_id]).update_attribute(:student, @student)
end
end当然,这需要一些错误捕获和细化,但是应该让您开始。
发布于 2014-01-21 09:04:23
没有尝试解决方案,但您确实立即想起了after_create,after_update:
学生:
after_create :update_locker
after_update :update_locker
private
def update_locker
Locker.update(self.locker_id, :student_id => self.id)
end当然,我现在对储物柜的验证有问题,因为如果我选择一个已经使用过的储物柜,并通过我的解决方案来更新它,那么只有一个学生可以拥有储物柜,而不是more.Currently,我得到了成功更新的学生信息,但是储物柜没有更新。
https://stackoverflow.com/questions/21253112
复制相似问题