Ruby on rails 防止联接表为空 关系 类升级:促销\u抽奖 结束 类别促销抽奖

Ruby on rails 防止联接表为空 关系 类升级:促销\u抽奖 结束 类别促销抽奖,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,因此,通过联接表Promotion Sweepstick,促销活动有许多抽奖。这是一个遗留的db模式,因此命名可能有点奇怪,并且遗漏了一些self.table_name==和foreign_key内容 此应用程序的性质要求加入表中至少有一个promotionId条目,因为没有抽奖将破坏应用程序 第一个问题 我如何保证促销抽奖中始终有一个条目用于促销?创建时必须至少包含一个sweepstick.id,并且一旦在联接表中创建了一个条目,每个促销/促销\u id必须至少包含一个 第二个问题(其他选择)

因此,通过联接表Promotion Sweepstick,促销活动有许多抽奖。这是一个遗留的db模式,因此命名可能有点奇怪,并且遗漏了一些self.table_name==和foreign_key内容

此应用程序的性质要求加入表中至少有一个promotionId条目,因为没有抽奖将破坏应用程序

第一个问题 我如何保证促销抽奖中始终有一个条目用于促销?创建时必须至少包含一个sweepstick.id,并且一旦在联接表中创建了一个条目,每个促销/促销\u id必须至少包含一个

第二个问题(其他选择) 如果前面的建议不可能实现(我怀疑这是真的),那么还有另一种解决问题的方法。有一种带有特定id的“默认抽奖”。如果通过表单删除所有抽奖\u id(以便删除联接表中的所有促销条目),我可以在促销抽奖中创建一个新条目吗

伪_码(排序) 删除id为[1,4,5]的促销\u抽奖,其中促销\u id=1 如果id=1的促销活动没有促销活动\u抽奖 添加促销id为1和抽奖id为100的促销抽奖 结束


感谢您的帮助。

在创建和修改促销活动时,状态验证应该可以解决问题

class Promotion < ActiveRecord::Base
  has_many :promotion_sweepstakes
  has_many :sweepstakes,
    :through => :promotion_sweepstakes
  validates :sweepstakes, :presence => true
end

在PromotionSweepsket中添加一个before_destroy方法也是我的尝试之一,但不知何故,我一定是把这个方法弄错了(现在已经丢失了)。如果你能把它记下来,让我看看我是否完全错过了我的目标,我会非常高兴。赏金是你的(14小时后)。@eml,我已经修改了答案。现在剪了吗?谢谢你的片段。很抱歉没有早点给你奖金,即使你不修改你的答案,我最终也会给你的。非常感谢你,我的朋友。
class Promotion < ActiveRecord::Base
  has_many :promotion_sweepstakes
  has_many :sweepstakes,
    :through => :promotion_sweepstakes
  validates :sweepstakes, :presence => true
end
class PromotionSweepstake < ActiveRecord::Base
  belongs_to :promotion
  belongs_to :sweepstake
  before_destroy :check_for_promotion_on_destroy

private

  def check_for_promotion_on_destroy
    raise 'deleting the last sweepstake' if promotion.sweepstakes.count == 1
  end
end

class Sweepstake < ActiveRecord::Base
  has_many :promotion_sweepstakes
  has_many :promotions, :through => :promotion_sweepstakes
  before_destroy :check_for_promotions_on_destroy

private

  def check_for_promotions_on_destroy
    promotions.each do |prom|
      raise 'deleting the last sweepstake' if prom.sweepstakes.count == 1
    end
  end

end