Как мне проверить уникальность модели has_many: through join? - PullRequest
8 голосов
/ 23 ноября 2011

У меня есть пользователи и проблемы, к которым присоединилась модель голосования.Пользователи могут голосовать по вопросам.Они могут голосовать за или против (что записано в модели голосования).Во-первых, я хочу, чтобы пользователи не могли подавать несколько голосов в одном направлении.Во-вторых, я хочу позволить пользователям голосовать против.Так что, если они проголосовали, они все равно смогут проголосовать, что заменит голосование.Пользователи никогда не должны иметь возможность голосовать по вопросу дважды.Вот мои файлы:

class Issue < ActiveRecord::Base
  has_many :associations, :dependent => :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 < ActiveRecord::Base
  authenticates_with_sorcery!

  attr_accessible :email, :password, :password_confirmation

  validates_confirmation_of :password
  validates_presence_of :password, :on => :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

Ответы [ 2 ]

11 голосов
/ 23 ноября 2011

Вы бы наложили ограничение уникальности на модель Votership. Вам не нужно ставить валидации для самой ассоциации.

class Votership < ActiveRecord::Base
  belongs_to :user
  belongs_to :issue

  validates :issue_id, :uniqueness => {:scope=>:user_id}
end

Это означает, что пользователь может иметь только один голос по данному вопросу (вверх или вниз).

0 голосов
/ 12 февраля 2018

Модели отношений:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...