2010-07-06 2 views
3

Есть ли способ проверить, что полиморфная ассоциация связана только с одним элементом? например, если у меня есть комментарии, которые являются полиморфными и могут быть на фотографиях, сообщениях и т. д. Я хочу убедиться, что если я добавлю комментарий к списку комментариев в сообщениях, это, если комментарий уже связан с сообщением , добавление не удастся. (ошибка уникальности проверки). Есть идеи?Проверка полиморфной ассоциации?

ответ

6

Так я предполагаю, что у вас есть что-то вроде этого:

class Comment < ActiveRecord::Base 
    belongs to commentable, :polymorphic => true 
end 

class Post < ActiveRecord::Base 
    has_many :comments, :as => commentable, :dependent => :destroy 
end 

class Photo < ActiveRecord::Base 
    has_many :comments, :as => commentable, :dependent => :destroy 
end 

Если предположить, что Comment модель имеет несколько атрибутов, как author и body (что вы хотите быть уникальным), то вы можете создать пользовательскую проверку в этой модели, как это:

validate do |comment| 
    if comment.commentable_type.constantize.comments.find_by_author_and_body(comment.author, comment.body) 
    comment.errors.add_to_base "Duplicate comment added for ..." 
    end 
end 

Я также предположил, что комментарии создали что-то вроде этого:

@post.comments.create(:author => name, :body => comment_text) 
+0

Фактически, он является полиморфным с has_many через таблицу соединений, поэтому полиморфная ассоциация находится в таблице соединений. Я просто положил валидацию на _id и _type с областью определения элемента, и он работал нормально. – tesserakt

Смежные вопросы