Проверка модели перекрестной уникальности в rails

#ruby-on-rails #ruby #validation #activerecord #models

#ruby-on-rails #ruby #проверка #activerecord #Модели

Вопрос:

У меня есть модель, в которой я хочу, чтобы столбцы содержали разные идентификаторы. Таким образом, пользователь может следовать за другим пользователем, но не следовать за собой.

Миграция

 class CreateFollows < ActiveRecord::Migration
  def change
    create_table :follows do |t|
      t.integer :follower_id
      t.integer :followee_id

      t.timestamps
    end
  end
end
  

Модель

 class Follow < ActiveRecord::Base
  belongs_to :follower, class_name: 'User'
  belongs_to :followee, class_name: 'User'

  validates :follower_id, uniqueness: { scope: :followee_id }
end
  

Но мой тест, похоже, завершается неудачей

Тест

 it 'cannot follow itself' do
  user = FactoryGirl.create(:user)
  follow = FactoryGirl.create(:follow, follower: user, followee: user)
  expect(follow).to be_invalid
end
  

Вывод

 Failures:

1) Follow cannot follow itself
 Failure/Error: expect(follow).to be_invalid
   expected `#<Follow id: 27, follower_id: 78, followee_id: 78, created_at: "2014-07-04 02:20:59", updated_at: "2014-07-04 02:20:59">.invalid?` to return true, got false
 # ./spec/models/follow_spec.rb:23:in `block (2 levels) in <top (required)>'
  

Из всего, что я прочитал, это выглядит как запись. У кого-нибудь есть какие-нибудь указания?

Спасибо

Ответ №1:

Эта проверка:

 validates :follower_id, uniqueness: { scope: :followee_id }
  

просто говорится, что набор follower_id s для каждого followee_id не может содержать дубликатов (т. Е. вы не можете следовать за одним человеком дважды), это ничего не говорит о том, что followee_id отличается от follower_id .

Если вы хотите запретить следить за собой, вы должны так сказать:

   validate :cant_follow_yourself

private

  def cant_follow_yourself
    return if followee_id != follower_id
    # add an appropriate error message here...
  end