Проверка уникальности Rails 3 с областью действия на полиморфной таблице - PullRequest
1 голос
/ 17 октября 2011

У меня есть следующие настройки:

class Vote < ActiveRecord::Base
  belongs_to :voteable, :polymorphic => :true, :counter_cache => true
end

class Proposition < ActiveRecord::Base
  has_many :votes, :as => :voteable
end

class Winner < ActiveRecord::Base
  has_many :votes, :as => :voteable
end

Таблица голосования выглядит следующим образом:

t.string   "ip_address"
t.integer  "voteable_id"
t.string   "voteable_type"

Я хочу проверить следующее.Пользователь с данным ip_address может голосовать только за 1 предложение.Таким образом, комбинация ip_address, voiceable_id и voiceable_type должна быть уникальной.

Как мне добиться этого с помощью «простого» правила проверки?

Ответы [ 2 ]

3 голосов
/ 05 ноября 2015

Добавление области к уникальной :ip_address проверке

class Vote < ActiveRecord::Base
  # ...
  validates :ip_address, uniqueness: { scope: [:voteable_type, :voteable_id]}
end
3 голосов
/ 17 октября 2011

Чтобы гарантировать уникальность, вы должны добавить уникальный индекс в вашу БД

Если у вас еще нет важных данных, вы можете сделать это в процессе миграции с помощью add_index

add_index(:votes, [:ip_address, :voteable_id, voteable_type], :unique => true, :name => 'allowed_one_vote')

если у вас уже есть данные, это можно сделать с помощью SQL, и это зависит от вашей СУБД

...