如何validationhas_many的唯一性:通过连接模型?

我有一个选民模型加入的用户和问题。 用户可以对问题进行投票。 他们可以向上或向下投票(在选民模型中记录)。 首先,我希望能够阻止用户在一个方向上投票。 其次,我想允许用户投反对票。 所以,如果他们投了票,他们仍然可以投票放弃,这将取代上行投票。 用户永远不能对问题进行两次投票。 这是我的文件:

class Issue  :destroy has_many :users, :through => :associations has_many :voterships, :dependent => :destroy has_many :users, :through => :voterships belongs_to :app STATUS = ['Open', 'Closed'] validates :subject, :presence => true, :length => { :maximum => 50 } validates :description, :presence => true, :length => { :maximum => 200 } validates :type, :presence => true validates :status, :presence => true def cast_vote_up!(user_id, direction) voterships.create!(:issue_id => self.id, :user_id => user_id, :direction => direction) end end class Votership < ActiveRecord::Base belongs_to :user belongs_to :issue end class VotershipsController < ApplicationController def create session[:return_to] = request.referrer @issue = Issue.find(params[:votership][:issue_id]) @issue.cast_vote_up!(current_user.id, "up") redirect_to session[:return_to] end end class User  :create validates_presence_of :email validates_uniqueness_of :email has_many :associations, :dependent => :destroy has_many :issues, :through => :associations has_many :voterships, :dependent => :destroy has_many :issues, :through => :voterships end 

您可以将唯一性约束放在Votership模型上。 您不需要在关联本身上放置validation。

 class Votership < ActiveRecord::Base belongs_to :user belongs_to :issue validates :issue_id, :uniqueness => {:scope=>:user_id} end 

这意味着用户只能对给定的问题(向上或向下)进行一次投票。

关系模型:

 class Person has_many :accounts has_many :computers, through: :accounts end class Account belongs_to :person belongs_to :computer scope :administrators, -> { where(role: 'administrator') } end class Computer has_many :accounts has_many :people, through: :accounts end 

这就是它的名称

person.accounts.administrators.map(&:computer)

我们可以使用ActiveRecord :: SpawnMethods#merge更好地做到这一点!

person.computers.merge(Account.administrators)


参考: https : //coderwall.com/p/9xk6ra/rails-filter-using-join-model-on-has_many-through