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的初学者。
答案 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.更加敏捷的单位责任。
尽管考虑到语法错误,您仍可遵循此模式。