3

У меня есть четыре модели:ActiveRecord Validations для моделей с has_many, BELONGS_TO ассоциаций и ИППП

  • пользователя
  • Award
  • Знак
  • GameWeek

Ассоциации заключаются в следующем:

  • У пользователя есть много вознаграждений.
  • Приз принадлежит пользователю.
  • Значок имеет множество наград.
  • Премия относится к значку.
  • У пользователя есть много game_weeks.
  • GameWeek принадлежит пользователю.
  • У GameWeek есть много наград.
  • Премия относится к игре_week.

Таким образом, user_id, badge_id и game_week_id являются иностранными ключами в таблице вознаграждений.

Значок реализует модель ИППП. Скажем так, у него есть следующие подклассы: BadgeA и BadgeB.

Некоторые правила отметить:

game_week_id Ф.К. может быть нулевым для BadgeA, но не может быть нулем для BadgeB.

Вот мои вопросы:

  1. Для BadgeA, как я пишу проверки, что она может быть присуждена только один раз? То есть пользователь не может иметь больше одного.
  2. Для BadgeB, как я могу написать подтверждение, что его можно получить только один раз за неделю игры?

ответ

1

модель данных:

В моем понимании, вот ваша модель данных (нажмите для увеличения):

Data model http://yuml.me/6afcad62

миграции:

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

class CreateAwards < ActiveRecord::Migration 
    def self.up 
    create_table :awards do |t| 
     # custom attributes here 
     t.string  :name 
     t.text  :description 
     t.references :user,  :null => false 
     t.references :game_week#, :null => false 
     t.references :badge,  :null => false 
     t.timestamps 
    end 
    # a user can be awarded no more than a badge per week 
    add_index :awards, [:user_id, :badge_id, :game_week_id], :unique => true 
    # a user can be awarded no more than a badge for ever 
    #add_index :awards, [:user_id, :badge_id], :unique => true 
    end 

    def self.down 
    drop_table :awards 
    end 
end 

Модель:

модель позволит вам удовлетворить как ваши требования, на уровне модели:

class Award < ActiveRecord::Base 
    validate_uniqueness_of :user, :badge, 
    :if => Proc.new { |award| award.badge === BadgeA } 
    validate_uniqueness_of :user, :badge, game_week, 
    :unless => Proc.new { |award| award.badge === BadgeA } 
    #validate_uniqueness_of :user, :badge, game_week, 
    # :if => Proc.new { |award| award.badge === BadgeB } 
end 

Примечание:

Я не пробовал эти фрагменты, но я думаю, что идея здесь :)

+0

Что такое === делать? – keruilin

+0

Это оператор равенства в Ruby. Вы можете увидеть более подробную информацию в [Object Ruby doc] [1] и в этом [блоге] [2]. [1]: http://ruby-doc.org/core/classes/Object.html#M000345 [2]: http://www.pluitsolutions.com/2006/10/09/comparing-equality- EQL-равно-и-дело-равенство-в-рубин / –

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