2

我有一个结构,其中 anItem可能属于 a Claim,如果是,我希望它的另一个字段也是必需的。这些是相关的代码片段:

class Claim
  has_many :items
  accepts_nested_attributes_for :items
  validates_associated :items
end

class Item
  belongs_to :claim
  validates :amount_paid, :presence => {:if => :claim}
end

几乎适用于所有情况。当我编辑现有的 Claim并尝试在该amount_paid字段中输入空格时,我得到了我想要的错误。并且Claim当它达到这个验证时应该存在,因为之前的迭代也有效,相当于

validates :claim_id, :presence => {:unless => :new_claim?}
...
def new_claim?
  claim.new_record? # would have thrown an error if claim was nil
end

但是,当我在其上创建一个带有空白字段的 时,验证通过,这是他们不应该的。Claimamount_paidItems

没用,我也试过

validates :amount_paid, :presence => {:if => :claim_exists?}
...
def claim_exists?
  !!claim
end

还有其他想法吗?

4

2 回答 2

0

我相信可以通过向:inverse_of关联添加一个选项来解决这个问题:

class Claim
  has_many :items, :inverse_of => :claim
end

class Item
  belongs_to :claim, :inverse_of => :items
end

(不过,自从我遇到这个问题以来已经有一段时间了,所以如果你遇到和我一样的问题,请做一些实验。)

于 2012-10-15T21:42:14.903 回答
0

我所做的可能有点骇人听闻,但它似乎有效:

class Item
  ...
  validates :amount_paid, :presence => {:if => :claimed?}
  ...
  def claimed?
    !!claim || caller.any? { |m| m =~ /claims_controller/ }
  end
end

因此,如果声明存在,或者如果从ClaimsController堆栈跟踪中的任何位置调用此声明,则验证将运行。

我仍然欢迎任何有更好想法的人提供意见。

于 2012-08-07T04:06:59.117 回答