gpt4 book ai didi

ruby-on-rails - 具有has_many,belongs_to关联和STI的模型的ActiveRecord验证

转载 作者:行者123 更新时间:2023-12-04 07:40:16 24 4
gpt4 key购买 nike

我有四个模型:


用户

徽章
GameWeek


关联如下:


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


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

徽章实现STI模型。我们只说它具有以下子类:BadgeA和BadgeB。

需要注意的一些规则:

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

这是我的问题:


对于BadgeA,我该如何编写一次只能授予一次的验证?也就是说,用户最多只能拥有一个。
对于BadgeB,我该如何编写一个验证,证明它每场比赛一周只能获得一次?

最佳答案

资料模型:

以我的理解,这是您的数据模型(单击放大):

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


注意:

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

关于ruby-on-rails - 具有has_many,belongs_to关联和STI的模型的ActiveRecord验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2900762/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com