使用Rails验证两个属性中只有一个存在的最优雅方法是什么?

mar*_*cgg 3 ruby validation polymorphism ruby-on-rails

class Followup < ActiveRecord::Base
  belongs_to :post
  belongs_to :comment
end
Run Code Online (Sandbox Code Playgroud)

此模型只需要一个帖子或一个评论,但只需要两个中的一个.

这是我正在尝试做的rspec:

  it "should be impossible to have both a comment and a post" do
    followup = Followup.make
    followup.comment = Comment.make
    followup.should be_valid
    followup.post = Post.make
    followup.should_not be_valid
  end
Run Code Online (Sandbox Code Playgroud)

我可以看到一堆解决方案来做到这一点,但这样做最优雅的方法是什么?

Cha*_*hap 7

我认为你真正想要的是一个多态关联.

Ryan在Railscast#154中做了很好的解释.

class Followup < ActiveRecord::Base
  belongs_to :followupable, :polymorphic => true
end

class Post < ActiveRecord::Base
  has_many :followups, :as => :followupable
end

class Comment < ActiveRecord::Base
  has_many :followups, :as => :followupable
end
Run Code Online (Sandbox Code Playgroud)