データ・モデル:
私の理解では、これがあなたのデータモデルです(クリックして拡大):
データモデル http://yuml.me/6afcad62
移行:
移行により、移行レベルで 2 番目の要件を満たすことができます。
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
ノート:
私はこれらのスニペットを試しませんでしたが、アイデアはここにあると思います:)