【问题标题】:How do I set up to has_many/belongs_to assocations so that only one combination is allowed?如何设置 has_many/belongs_to 关联,以便只允许一种组合?
【发布时间】:2011-11-16 19:33:42
【问题描述】:

我有三个表,申请者、用户和评级。基本思想是每个申请人都会被任意数量的用户分配一个评级。这部分我工作没有任何问题。但是,如果用户去编辑他们的评分(包括分数),表单会添加第二个评分。我需要进行一些更改,以便每个用户只能为给定的申请人分配一个评级。

class Applicant < ActiveRecord::Base
  has_many  :ratings
  accepts_nested_attributes_for :ratings, :allow_destroy => true

class User < ActiveRecord::Base  
  has_many  :ratings

评分表只包含一个申请者 ID、一个用户 ID 和一个分数。

class Rating < ActiveRecord::Base
  belongs_to  :user
  belongs_to  :applicant
  validates_uniqueness_of :applicant_id, :scope => :user_id

评分验证确保不接受第二个评分,但我需要更改关联(或表单),以便永远不会出现第二个评分选项。

我的申请表:

<%= f.fields_for :ratings do |builder| %>
    <%= builder.collection_select :score, Rating::SCORES, :to_s, :humanize %> 
    <%= builder.hidden_field :user_id, :value => current_user.id %>
    <%= builder.hidden_field :applicant_id, :value => @applicant.id %>
<% end %>

我如何指定(我猜是在申请人模型中,因为这是我正在编辑的表格)评分表中的申请人 ID、用户 ID 组合必须是唯一的?

【问题讨论】:

    标签: ruby-on-rails-3 validation nested-forms nested-attributes


    【解决方案1】:

    我最终通过执行以下操作使事情正常进行。

    在我的申请人控制器中,我将编辑方法更改为:

      def edit
        @applicant = Applicant.find(params[:id])
        @my_rating = Rating.where(:applicant_id => params[:id]).where(:user_id => current_user.id)
        if @my_rating.empty?
          @my_rating = @applicant.ratings.build
        end
      end
    

    由于我无法使用 current_user 创建范围,我认为它可以在这里工作。然后,在表单中,我将嵌套的属性字段更改为:

    <%= f.fields_for :ratings, @my_rating do |builder| %>
        <%= builder.collection_select :score, Rating::SCORES, :to_s, :humanize %> 
        <% if builder.object.user_id.nil?%>
            <%= builder.hidden_field :user_id, :value => current_user.id %>
        <% end %>
    <% end %>
    

    另一个重要的部分是上述评级模型中的唯一性验证。这样可以确保每个用户对每个申请人只能有一个评分。

    这对我来说似乎工作得很好,但如果有人对如何改进这个有任何建议,我很想听听。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-04
      相关资源
      最近更新 更多