在子模型中访问父对象

Access parent Object in Child model

我正在使用 rails 2.3.17 并设置了此关系

class Item < ActiveRecord::Base
  belongs_to :order
end

class Order < ActiveRecord::Base 
  has_many :items, :dependent => :delete_all
end

现在我需要通过访问 order 对象属性对项目进行验证,我该怎么做?

写的时候

validate :checkXYZ

def checkXYZ
  Rails.logger.debug self.order // I AM GETTING NIL
end

但是当我写的时候

before_save :checkXYZ

def checkXYZ
  Rails.logger.debug self.order // I AM ORDER OBJECT
end

这是我的控制器逻辑

@order = @otherObj.orders.create(params[:order])
item = @order.items.create(params[:item])

我需要在项目 class 的验证中获取订单对象,我该怎么做?

在 before_validate 部分,父项(订单)尚未连接到项目对象。因此它肯定会显示为零。

但在before_save阶段通过验证后,订单和商品已连接,因此您可以访问所选商品的父订单。

您可以使用以下方法来验证您的对象。

class Order < ActiveRecord::Base 
  has_many :items, dependent: :delete_all
end

class Item < ActiveRecord::Base
  before_save :something_missing?
  belongs_to :order

  private 
  def something_missing?  
     your_order = self.order 
      if (add_your_condition_which_is_violated)
        errors[:base] << "Your error message" 
        return false 
      end
       # When you are returning false here, the record won't be saved.
      # And the respective error message you can use to show in the view.
  end
end

要在创建或更新订单时可靠地执行此操作,您应该像这样在父对象(订单)的模型上调用验证:

class Order < ActiveRecord::Base 
    has_many :items, :dependent => :delete_all
    validate :checkXYZ

    private
    def checkXYZ
        Rails.logger.debug self // Here you will have the Order object
        for i in items do
            if (vehicle == 7 and i.distance <= 500) then // vehicle is an attribute of order
                errors.add(:error, "You're driving by car, distance must be larger than 500")
            end
        end
    end
end