验证依赖于其他模型的活动记录的模型值?

时间:2011-05-26 13:36:38

标签: ruby-on-rails activerecord

我有两种模式:

class Category < ActiveRecord::Base
  has_one :weight
  after_create :create_category_weight

  def create_category_weight
    self.weight = Weight.new :value => 1/Category.count
  end

end

和..

class Weight < ActiveRecord::Base
  belongs_to :category
  attr_accessible :value
end

我想将值可靠地设置为(1 /类别数)。我希望这可以在category.build_weight,category.new,category.create等的情况下工作。我已经尝试过上面的方法,以及使用观察者,但它很脆弱。对不同建筑方法的建议也表示赞赏。

谢谢, 贾斯汀

2 个答案:

答案 0 :(得分:2)

我会从ActiveRecord模型中提取创建逻辑并进入另一个类。类似的东西:

class CategoryRepository

  def new_category
    @category = Category.new
    @category.weight = Weight.new(:value => (1 / Category.count))
    @category
  end

  def create_category(attributes)
    @category = Category.create(attributes)
    @category.weight = Weight.new(:value => (1 / Category.count))
    @category.save
    @category
  end

end

@repository = CategoryRepository.new

@category = @repository.new_category

@category = @repository.create_category(params[:category])

答案 1 :(得分:1)

为什么不使用前验证回调来设置权重,并验证模型中的权重? (如果你这样做,请确保考虑到竞争条件......)