Vraag Validate scoped uniciteit in polymorfe associatiemodellen


Juist, dus ik heb een polymorfe associatie die ervoor zorgt dat verschillende objecttypen de voorkeur krijgen. Dus een persoon kan een product, een persoon of wat dan ook favoriet maken. Wat ik wil doen, is waken tegen iemand die een favoriet dupliceert met het valideren van uniciteit in het favoriete model.

class Favorite < ActiveRecord::Base
 belongs_to :favoritable, :polymorphic => true
 belongs_to :user

 attr_accessible :user

 validates_presence_of :user
 validates :user_id, :uniqueness => { :scope => [:favoritable_type, :favoritable_id] }
end

De validatie lijkt te werken, maar om welke reden dan ook wordt een nieuwe rij met favorieten nog steeds gemaakt met de user_id wanneer wordt geprobeerd het item te dupliceren.

enter image description here

Is er een manier om deze eerste opslag te stoppen?

Het lijkt erop dat Rails de DB-invoer aanmaakt en deze vervolgens als volgt bijwerkt met de favoritable_id en het favoritable_type:

  SQL (28.3ms)  INSERT INTO "favorites" ("created_at", "favoritable_id", "favoritable_type", "updated_at", "user_id") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["created_at", Tue, 14 Aug 2012 10:26:31 UTC +00:00], ["favoritable_id", nil], ["favoritable_type", nil], ["updated_at", Tue, 14 Aug 2012 10:26:31 UTC +00:00], ["user_id", 23]]
   (7.8ms)  COMMIT
   (0.1ms)  BEGIN
  Favorite Exists (0.3ms)  SELECT 1 AS one FROM "favorites" WHERE ("favorites"."user_id" = 23 AND "favorites"."id" != 123 AND "favorites"."favoritable_type" = 'Style' AND "favorites"."favoritable_id" = 29) LIMIT 1
   (0.2ms)  UPDATE "favorites" SET "favoritable_id" = 29, "favoritable_type" = 'Style', "updated_at" = '2012-08-14 10:26:31.943937' WHERE "favorites"."id" = 123
   (6.7ms)  COMMIT
   (0.1ms)  BEGIN

14
2017-08-14 10:28


oorsprong


antwoorden:


Als je dit nauwlettend in de gaten houdt, kun je ontdekken dat uniciteit validatie gewoon goed werkt :)

validates :user_id, :uniqueness => { :scope => [:favoritable_type, :favoritable_id] }

Kijk naar de gegevensafbeelding die je hebt toegevoegd. in de afbeelding kun je zien dat het tweede record het niet heeft favouritable terwijl de eerste heeft die anders is, dus 2 records zijn uniek en het is geen probleem met uniqueness maar het is jouw logische kloof.

Als u de tweede deelname strikt wilt vermijden, houd dan favouritable als verplicht veld

validates :favoritable_type, :favoritable_id, :presence => true

21
2017-08-14 11:06



class Favorite < ActiveRecord::Base

  belongs_to :user
  belongs_to :favoritable, polymorphic: true

  validates :user_id, :favoritable_id, presence: true,
    numericality: { only_integer: true }

  validates :favoritable_type, presence: true,
    inclusion: { 
      in: %w(FirstModelName SecondModelName),
      message: "%{value} is not a valid" 
    }

  validates :user_id, uniqueness: { scope: [ :favoritable_type, :favoritable_id ] }
end

5
2018-01-07 09:43



Heb je de vergelijkbare post doorgenomen?

Rails 3 uniciteit validatie met reikwijdte op polymorfe tafel

Het lijkt erop dat add_index er toe doet.


0
2017-08-14 10:33