我有一个Item
可能属于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
但是当我在其Claim
上创建一个空白amount_paid
字段的新 Items
时,验证通过,而不应该通过。
无济于事,我也试过了
validates :amount_paid, :presence => {:if => :claim_exists?}
...
def claim_exists?
!!claim
end
还有其他想法吗?
答案 0 :(得分:0)
我所做的可能是一些黑客攻击,但似乎有效:
class Item
...
validates :amount_paid, :presence => {:if => :claimed?}
...
def claimed?
!!claim || caller.any? { |m| m =~ /claims_controller/ }
end
end
因此,如果声明存在,或者在堆栈跟踪中的任何位置从ClaimsController
调用此声明,则验证将会运行。
我仍然欢迎任何有更好主意的人的意见。
答案 1 :(得分:0)
我认为可以通过向关联添加:inverse_of
选项来解决问题:
class Claim
has_many :items, :inverse_of => :claim
end
class Item
belongs_to :claim, :inverse_of => :items
end
(自从我遇到这个问题已经有一段时间了,所以如果你遇到和我一样的问题,那就做一些实验吧。)