【问题标题】:Dynamically change model attributes动态更改模型属性
【发布时间】:2013-12-17 05:33:04
【问题描述】:

有没有办法在 Rails 模型中动态更改属性?

这是我目前的情况。我有一个客户端模型,里面有五个客户端。这些客户有:

attr_accessible :name, :image, :order

order 属性是为了让客户端可以按照管理员希望它们显示的顺序显示。

因此,五个客户端中的每一个的顺序为 1、2、3、4 或 5。假设我创建了另一个客户端,并希望该客户端的顺序为 4。如果我按照我的方式执行此操作知道如何,客户订单将是 1, 2, 3, 4(new 4) ,4(old 4) ,5.

我希望最后两个客户的订单中添加了 1,因此客户订单看起来像 1, 2, 3, 4(new 4) ,5(old 4) , 6(旧 5)。

这样,当客户列表变大时,我会更容易将新客户添加到我希望他们按顺序排列的位置,并让其余客户的订单动态更改。

【问题讨论】:

    标签: ruby-on-rails ruby activerecord


    【解决方案1】:

    如果您还不清楚如何自己执行此操作,请使用以下 Rails 代码:

    Client.all.update_all('sort_order = sort_order+1', ['sort_order >= ?', inserted_order])
    

    将对所有订单大于或等于inserted_order的客户记录的sort_order属性加一。

    注意:我将order属性更改为sort_order以避免与SQL关键字冲突。请注意为什么这对您来说不是问题。

    【讨论】:

    • 这里插入的订单是什么?是 >= 吗?也等于插入订单?这是否也会影响当前客户端,因为在我的示例中它仍然 >= 4。
    • 它将代表您尝试插入“at”的顺序(例如 OP 示例中的 4)。
    • 此代码是否会影响 order => 4 的两个实例?还是只是旧的?
    • 取决于您是在保存插入 at 4 的记录之前还是之后执行它。:-)
    • 当我运行你给我的命令时,我得到了错误:ActiveRecord::StatementInvalid: SQLite3::SQLException: near "order": syntax error: UPDATE "studios" SET order = order+1 WHERE (订单 >= 2)
    【解决方案2】:

    我认为您正在寻找acts_as_list gem。

    https://github.com/swanandp/acts_as_list

    我自己没有使用过它,但我知道它,我认为它会做你想要的。

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2016-11-25
      • 2019-08-11
      • 2016-02-22
      • 1970-01-01
      • 2016-03-17
      • 2019-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多