3

我有四个模型:

  • 用户
  • 徽章
  • 游戏周刊

关联如下:

  • 用户有很多奖励。
  • 奖励属于用户。
  • 徽章有许多奖项。
  • 奖品属于徽章。
  • 用户有很多 game_weeks。
  • GameWeek 属于用户。
  • GameWeek 有很多奖项。
  • 奖项属于 game_week。

因此,user_id、badge_id 和 game_week_id 是奖励表中的外键。

Badge 实现了一个 STI 模型。假设它有以下子类:BadgeA 和 BadgeB。

需要注意的一些规则:

对于 BadgeA,game_week_id fk 可以为 nil,但对于 BadgeB,不能为 nil。

以下是我的问题:

  1. 对于 BadgeA,我如何编写只能授予一次的验证?也就是说,用户不能拥有多个——永远。
  2. 对于 BadgeB,我如何编写一个验证,证明它每周只能获得一次?
4

1 回答 1

1

数据模型:

在我的理解中,这是您的数据模型(点击放大):

数据模型 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

笔记:

我没有尝试这些片段,但我认为这个想法就在这里:)

于 2010-05-27T16:01:51.590 回答