Ruby 铁路";是否有可能知道验证方法中正在执行的操作(更新、创建)?

Ruby 铁路";是否有可能知道验证方法中正在执行的操作(更新、创建)?,ruby,ruby-on-rails-3,customvalidator,Ruby,Ruby On Rails 3,Customvalidator,站台:轨道3.0 数据库:mysql 5.1 业务需求:一次只能发布一项产品。退回已发行的商品后,可以为同一产品发行新商品。一次可以发布来自不同产品的多个项目 为了实现上述业务需求,我正在检查在相同的日期范围内是否已经为相同的产品发布了一个项目(通过检查我的以下位置中的日期是否重叠) class项0,则添加(:base,“此产品的商品已发行,尚未退回”) 结束 结束 上面定义的验证在创建时可以很好地工作,但在更新的情况下,我需要实现不同的逻辑。我不想为同一个需求定义两种方法。所以我想根据函数的

站台:轨道3.0 数据库:mysql 5.1

业务需求:一次只能发布一项产品。退回已发行的商品后,可以为同一产品发行新商品。一次可以发布来自不同产品的多个项目

为了实现上述业务需求,我正在检查在相同的日期范围内是否已经为相同的产品发布了一个项目(通过检查我的以下位置中的日期是否重叠)

class项?和产品id=?”,返回日期,发布日期,产品id)
错误。如果items.size>0,则添加(:base,“此产品的商品已发行,尚未退回”)
结束
结束

上面定义的验证在创建时可以很好地工作,但在更新的情况下,我需要实现不同的逻辑。我不想为同一个需求定义两种方法。所以我想根据函数的update或create操作来实现对函数的检查。有没有办法知道触发验证的操作是update还是delete?

简单的解决方案是定义一个方法来验证它,使用一个参数,然后使用不同的
:on=>
调用进行两次验证,然后用参数调用第一个方法


此外,如果有帮助,您可以使用
new\u record?
,它将告诉您是否正在创建对象(在保存对象之前)

验证可以随时运行,而不仅仅是在
create
save
update\u attributes
等范围内。因此,即使您知道是什么方法触发了验证(您可以随意使用
调用者的输出
),您不应该使用它,因为它可能是完全有效但完全出乎意料的东西

但是,并非所有记录都丢失。您可以通过调用
persisted?
来检查记录是否已持久化

 class Item < ActiveRecord::Base
   validate :validate_one_item_for_product, :unless => :persisted?

 private

   def validate_one_item_for_product
     items = Item.where(
       "issue_date < ? and return_date > ? and product_id = ?",
       return_date, issue_date, product_id)
     if items.size > 0
       errors.add(:base,
         "item already issued for this product, not returned yet") 
     end
   end
 end
class项:持久化?
私有的
def验证产品的一个项目
items=Item.where(
“发布日期<?和返回日期>?以及产品id=?”,
退货日期、发行日期、产品id)
如果items.size>0
错误。添加(:base,
“此产品的商品已发行,尚未退回”)
结束
结束
结束

您似乎不赞成使用validate_on_create和validate_on_update而不是validate,它可以在我的案例中使用,而不是:除非=>persistend。这里我关心的是基于update或create重载函数,或者添加基于update或create调用定义的方法中的检查。因此在这种情况下,解决方案你提供的n不起作用,对吗?但在某个地方,我感觉你告诉我了你的经验中的一些复杂的事情,因为我面临着另一个问题,这也可能与你在这里建议的有关,请看一个,do
validate:validate\u method\u For\u create,:除非=>:persistend?
;另一个,do
validate:val更新的后期方法:if=>:persistend?
。什么abt sol,创建时验证方法:创建时验证方法:其他时验证方法:更新时验证方法:更新时验证方法这是rails在其教程中建议的,它没有像我在其他问题中所指定的那样工作。谢谢。你能为:on=>调用编写几行语法吗?
 class Item < ActiveRecord::Base
   validate :validate_one_item_for_product, :unless => :persisted?

 private

   def validate_one_item_for_product
     items = Item.where(
       "issue_date < ? and return_date > ? and product_id = ?",
       return_date, issue_date, product_id)
     if items.size > 0
       errors.add(:base,
         "item already issued for this product, not returned yet") 
     end
   end
 end