通过has_one和belongs_to将_existing_对象与用户关联?

时间:2014-01-22 21:14:13

标签: ruby-on-rails belongs-to has-one

所以这是我的模特:

user.rb: has_one :interview_slot

interview_slot.rb:belongs_to :user

interview_slot有一个start_time,一个end_time和一个available布尔值。

例如,假设我已经生成了20个interview_slot个实例的列表,我想要做的就是让我的用户从下拉框中选择其中一个。

我首先检查用户是否已经有一个访谈位置:

@interview_slot = find_interview_slot(@rushee)

  def find_interview_slot(user)
    return InterviewSlot.find_by(user_id: user.id)
  rescue
    nil
  end

如果@interview_slotnil,那么我想在下拉框中显示所有仍为available的面试广告位列表,我希望用户能够选择其中一个访谈位置,点击提交,并将指定的InterviewSlot与用户相关联。我的问题是,如何编写将要执行此操作的表单?我只熟悉调用类似@user.interview_slots.build和调用form_for之类的内容:form_for(@interview_slot) do |f|,但显然我不想在这种情况下建立一个新的interview_slot,我只是想关联用户现有的访谈时间。

有什么见解?感谢。

编辑:我还有一个实例变量,它是尚未与用户关联的所有InterviewSlots的集合:@available_slots = InterviewSlot.where(user_id: nil);我只是不知道如何制作允许用户从此集合中选择单个插槽并将插槽与用户关联的表单。

编辑2:

我现在有这个代码:

    <%= form_for(@interview_slot) do |f| %>

      <% slots_for_select = {}
        @available_slots.each do |slot|
          slots_for_select[slot.start_time.strftime("%a. %D | %l:%M %p")] = slot
        end %>

      <%= select_tag(:interview_slot, options_for_select(slots_for_select)) %>

      <%= f.submit "Schedule Interview", class: "btn btn-sm" %>

    <% end %>

这给了我一个所有可用面试插槽的下拉框,但问题是,@interview_slot在控制器中设置为等于@user.interview_slots.build(interview_slot_params) - 如何让它更新选定的interview_slot是否具有@user的ID,而不是创建新的interview_slot?

1 个答案:

答案 0 :(得分:0)

# interview_slots_controller.rb

def update
  interview_slot = InterviewSlot.find(params[:interview_slot_id])
  interview_slot.user_id = your_current_user.id
  interview_slot.save
end