Ruby on rails Rails如何通过回调模型中的另一个attr查找id?

Ruby on rails Rails如何通过回调模型中的另一个attr查找id?,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,我希望创建一个回调,如果找到另一个模型的id属性,则在其中更新一个对象 在这种情况下,如果找到订单id,则更新Odata模型 有人知道如何根据另一个模型id属性查找对象吗 class Order < ActiveRecord::Base after_update :update_odata def update_odata order = Order.find_by_id(attributes['id']) od = Odata.find_by_

我希望创建一个回调,如果找到另一个模型的id属性,则在其中更新一个对象

在这种情况下,如果找到订单id,则更新Odata模型

有人知道如何根据另一个模型id属性查找对象吗

class Order < ActiveRecord::Base
 after_update  :update_odata


  def update_odata
        order = Order.find_by_id(attributes['id'])
        od = Odata.find_by_id(attributes['order_id'])
        od.shipping_cost = order.shipping_cost
        od.shipping_method  = order.shipping_method
        od.status  = order.status
        od.feedback_id = order.feedback_id
        od.track_number  = order.track_number
        od.seller_name  = order.seller_name
        od.buyer_name  = order.buyer_name
       od.save

   end
end
类顺序
一般来说,在求助于他人帮助解释StackOverflow之前,您应该至少努力学习您正在使用的工具

为了回答您的问题,
find(1)
实际上是
find\u by(id:1)
的快捷方式。因此,如果您想按客户id查找订单,您可以这样做:
order.find\u by(customer\u id:42)

或者,如果您试图根据
顺序
(根据Rails应用程序的构建方式和您示例中不寻常的
属性
做一些假设)来确定这一点:

在这种情况下,您可能只需要使用关系:

class Order < ApplicationRecord
  has_one :odata
end

class Odata < ApplicationRecord
  belongs_to :order
end

# controller:
order = Order.find params[:id]
od = order.odata
类顺序
如果你想做你上面的事情,这可能是一条不好的道路,你可能会想做这样的事情:

class Order < ApplicationRecord
  has_one :odata

  def attributes_for_odata
    %w{ shipping_cost shipping_method status feedback_id track_number seller_name buyer_name }
  end

  def update_order_data
    odata.update attributes.slice(*attributes_for_odata)
  end
end
类顺序
sorry没有那么简单@coreyward更具体地说,
find(x)
相当于
find\u by!(id:x)
因为
find
在查找失败时会抛出异常。@实际上,如果您的问题是问我认为它在说什么。首先,查找在模型中,而不是在控制器上,第二,我要找的不是具体的id@bookaka你真的需要更好地解释,因为你说的话对我来说毫无意义。试着描述你想要发生的事情,在你的问题中通过编辑来澄清它。作为一个提示,如果你需要指导或辅导,可以尝试诸如、或之类的服务。
class Order < ApplicationRecord
  has_one :odata

  def attributes_for_odata
    %w{ shipping_cost shipping_method status feedback_id track_number seller_name buyer_name }
  end

  def update_order_data
    odata.update attributes.slice(*attributes_for_odata)
  end
end