【问题标题】:Rails" Is it possible to know operation(update, create) being performed within validation method?Rails”是否可以知道在验证方法中执行的操作(更新、创建)?
【发布时间】:2011-03-23 01:58:47
【问题描述】:

平台:Rail 3.0 数据库:mysql 5.1

业务需求:一次只能发一件产品。退回已发出的物品后,可以发出相同产品的新物品。一次可以发出来自不同产品的多个项目。

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

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

上面定义的验证在创建时可以正常工作,但在更新的情况下我需要实现不同的逻辑。我不想为相同的要求定义两种方法。所以我想根据函数是更新还是创建操作来实现检查。有什么方法可以知道触发验证的操作是更新还是删除?

【问题讨论】:

    标签: ruby ruby-on-rails-3 customvalidator


    【解决方案1】:

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

    另外,如果有帮助,您可以使用new_record?,它会告诉您是否正在创建对象(在保存之前)

    【讨论】:

    • 谢谢。你可以为 :on => call 写几行语法吗?
    【解决方案2】:

    验证可以随时运行,而不仅仅是在createsaveupdate_attributes 等范围内。所以即使你知道是什么方法触发了验证(你可以用@987654325 的输出破解@),你不应该使用它,因为它可能是完全有效但完全出乎意料的东西。

    但是,一切都没有丢失。您可以调用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
    

    【讨论】:

    • 您似乎不赞成使用 validate_on_create 和 validate_on_update 而不是 validate 可以在我的情况下使用而不是 :unless => 持续存在。在这里,我关心的是基于 update 或 create 重载函数,或者在基于 update 或 create 调用定义的方法中添加检查。所以在那种情况下你提供的解决方案是行不通的,对吧?
    • 但在某处我觉得你从你的经验中告诉我一些复杂的事情,因为我面临另一个问题,这也可能与你在这里的建议有关,请参阅stackoverflow.com/questions/5400261/…
    • 一,做validate :validate_method_for_create, :unless =&gt; :persisted?;对于另一个,做validate :valiate_method_for_update, :if =&gt; :persisted?
    • what abt sol, validate_on_create :validate_method_for_create for other validate_on_update :validate_method_for_update 这是 rails 在其教程中建议的内容,正如我在发布的其他问题中所指定的那样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    相关资源
    最近更新 更多