在具有外键的表中插入记录 - Ruby on Rails

时间:2015-10-29 02:03:10

标签: ruby-on-rails foreign-keys form-for

class UserPreference < ActiveRecord::Base
    belongs_to :user_job
    belongs_to :preference
end

class Preference < ActiveRecord::Base
    belongs_to :days
    belongs_to :location
    belongs_to :time_pref
    has_one :user_preference, :foreign_key => 'prefer1_id', :dependent => :destroy, :class_name => "UserPreference"
    has_one :other_user_preference, :foreign_key => 'prefer2_id', :dependent => :destroy, :class_name => "UserPreference"
end

我有这两个模特。 我正在尝试创建一个表单,我可以选择用户并使用下拉列表选择他们的首选项。

  %= form_for @user_preference, url: {action: "create"} do |f| %>
    <%= select_tag(:user_id, options_for_select(@user_options)) %>

<p><p> Preference 1 : 
<%= select_tag(:days_id, options_for_select(@day_options)) %>
<%= select_tag(:location_id, options_for_select(@building_options)) %>
<%= select_tag(:time_id, options_for_select(@time_slot_options)) %>
</p>
<p> Preference 2 : 
<%= select_tag(:days_id, options_for_select(@day_options)) %>
<%= select_tag(:location_id, options_for_select(@location_id)) %>
<%= select_tag(:time_pref_id, options_for_select(@time_pref_id)) %>
</p>

<%= f.submit "Submit" %>

这允许我选择一个用户并选择他们的偏好。 但是,如何使用外键实际将它们插入到prefer1_id和prefer2_id中?如果我使用上面显示的表单,我不会得到两组不同的首选项,而只是第二组下拉列表中的选项。

我希望做这样的事情(或其他一些代码)来在表格中创建新记录。

 def create
        @pref = preference.new(params[:pref])
        redirect_to @pref
      end

如何做到这一点?我是Rails的初学者。

1 个答案:

答案 0 :(得分:0)

我可以给你一个主意。
1.首先更新您的关联 2.使用用户首选项实现表单并使用嵌套表单。

您的用户首选项类应如下所示:

class UserPreference < ActiveRecord::Base
    belongs_to :user_job
    has_one :preference_one, :foreign_key => 'prefer1_id', :dependent => :destroy, :class_name => "UserPreference"
   has_one :preference_two, :foreign_key => 'prefer2_id', :dependent => :destroy, :class_name => "UserPreference"

  accepts_nested_attributes_for :preference_one # configure your options
  accepts_nested_attributes_for :preference_two # configure your options
end


class Preference < ActiveRecord::Base
    # ...
    belongs_to :user_preference, :foreign_key => 'prefer1_id', :dependent => :destroy, :class_name => "UserPreference"
    belongs_to :other_user_preference, :foreign_key => 'prefer2_id', :dependent => :destroy, :class_name => "UserPreference"
end

现在在您的控制器中:

def new
   @user_preference = UserPreference.new
   @user_preference.build_preference_one
   @user_preference.build_preference_two
end

def create
    @user_preference = UserPreference.new(user_preference_params)
    # make sure you add your nested attributes on the permitted param list.
end

以您的形式:

  

在我们建立新行动的基础上,使用字段进行两次单独的关联。

如果我解决了这个问题,这就是我设计表单的方式。 优点:
1.可维护的代码
2.控制器代码少 3.更加敏捷的单位责任。

尽管考虑到语法错误,您仍可遵循此模式。