как добавить уникальность в ассоциацию ActiveRecord с помощью ruby ​​on rails

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

class User < ActiveRecord::Base 
     has_many :articles
end

class Article < ActiveRecord::Base 
     belongs_to :user
     has_many :comments 
end

class Comment< ActiveRecord::Base 
     belongs_to :article
     has_many :votes
end

class Vote< ActiveRecord::Base 
     belongs_to :comment
     belongs_to :post
end

person Francis Chibaye    schedule 04.02.2014    source источник
comment
Ваш код показывает два класса Comment. Как это возможно?   -  person Peeyush    schedule 04.02.2014
comment
Есть два класса комментариев. Пожалуйста, исправьте свой вопрос. Это должно быть опечатка!   -  person Pavan    schedule 04.02.2014


Ответы (2)


сделайте это изменения (я думаю, это ваша опечатка)

class CommentPost< ActiveRecord::Base 
 belongs_to :comment
 belongs_to :post
end

создать миграцию для добавления индекса

add_index :comment_post, [:comment_id, :post_id], unique: true

то же самое для голосов используйте индекс

person user3134821    schedule 04.02.2014

Основываясь на вашем объяснении проблемы и просмотре некоторых комментариев, оставленных другими, я считаю, что блок кода, который вы намеревались предоставить, был примерно таким:

class User < ActiveRecord::Base 
     has_many :articles
     has_many :votes
end

class Article < ActiveRecord::Base 
     belongs_to :user
     has_many :comments 
end

class Comment< ActiveRecord::Base 
     belongs_to :article
     has_many :votes
end

class Vote< ActiveRecord::Base 
     belongs_to :comment
     belongs_to :user
end

vote связан с comment и с user. Но вы хотите убедиться, что user может проголосовать за любого comment только один раз. Для этого вы можете изменить класс Vote, добавив строку проверки:

class Vote< ActiveRecord::Base 
     belongs_to :comment
     belongs_to :user

     validates :user, uniqueness: { scope: :comment,
                                    message: "User can only vote on this comment one time" }
end

Чтобы объяснить вышесказанное... Вы добавляете строку для проверки уникальности пользователя для голосования. Но если вы не сузите рамки уникальности, то вы скажете, что пользователь может проголосовать только один раз (во всей вашей системе). Когда вы указываете область уникальности пользователя как :comment, вы говорите, что пользователь может голосовать только один раз за комментарий.

person Alvin S. Lee    schedule 04.02.2014
comment
Могу ли я установить, чтобы пользователь мог голосовать только за один комментарий к посту? - person Francis Chibaye; 14.02.2014
comment
Так как комментарий относится к статье (сообщению), то вы можете изменить область уникальности на :article вместо :comment. Это ограничивает пользователя голосованием только один раз (за комментарий) за статью. - person Alvin S. Lee; 14.02.2014