我有四种模式:
协会如下:
因此,user_id,badge_id和game_week_id是奖励表中的外键。
徽章实现了STI模型。我们只说它有以下子类:BadgeA和BadgeB。
需要注意的一些规则:
对于BadgeA,game_week_id fk可以为零,但对BadgeB来说不能为零。
以下是我的问题:
答案 0 :(得分: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
注意:强>
我没有尝试这些片段,但我认为这个想法就在这里:)