Rails:“_changed?”对于关系的价值

时间:2013-10-27 22:05:58

标签: ruby-on-rails ruby controller one-to-many activemodel

在我的项目中,我有User个具有多个Order个对象的对象。 现在,在我的表单上,用户可以编辑他的凭据并可以取消激活分配订单:

Orderform:
- Firstname
- Lastname
- Email
- Subform Orders:
  - Order1
    - active
  - Order n
    - active

现在,对于订单上的任何属性,我可以在使用user.first_name_changed?保存对象之前检测更改。 但是,如果我想检测,如果订单上的活动/非活动状态发生了变化(完成了复选框),那么我就无法执行user.orders_changed?或其他任何行。

是否有一种简单的方法可以知道用户对象上to_many关系的属性何时发生了变化。

当我在表单中更改内容时,我得到的params如下所示:

{
    "firstname": "peter",
    "lastname": "peter",
    "orders_attributes": {
        "0": {
            "id": "1",
            "is_scheduled": "1"
        },
        "1": {
            "id": "2",
            "is_scheduled": "1"
        },
        "2": {
            "id": "3",
            "is_scheduled": "1"
        }
    },
}

更新:我目前执行以下操作来检查给定user的产品是否已更改:

def check_for_changes(user, params)
  user.attributes = params
  product_changed = user.product_id_changed?

  # TODO: Check if any `is_scheduled` attributes changed on child-orders
  # <Insert magic here> 
end

更新2

我尝试过DGM的方法,但奇怪的是我无法在订单对象上检查is_scheduled_changed?

此操作失败,我不确定为什么属性is_scheduled没有等效的is_scheduled_changed?

user.orders.any?(&:is_scheduled_changed?)
!! #<NoMethodError: undefined method `is_scheduled_changed?' for #<Order:0x007fd5927ae620>>

检查id属性是否正常运行:

user.orders.any?(&:id_changed?)  # => false

这不会引发异常,但即使我更改了

形式的内容,也会返回false
user.orders.any?(&:changed?) # => false

1 个答案:

答案 0 :(得分:0)

如果使用通常的嵌套资源方法加载表单,这是否有效?

user.orders.any?(&:changed?)

基本上检查所有嵌套订单是否有任何更改。