在子模型中访问父对象
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