【问题标题】:Make counter cache column read only in rails使计数器缓存列在 rails 中只读
【发布时间】:2021-05-29 09:58:29
【问题描述】:

使列只读的最佳方法是什么,以便我们无法将值写入该列,即使在创建记录时也是如此。我知道提供了:attr_readonly,但这并不妨碍在创建记录时写入列。

【问题讨论】:

  • 您为什么要这样做?只是不要给它写信。
  • @Pascal 完全正确 - 通过使用强属性来控制模型的输入来解决这个问题。如果您将计数器缓存设为只读,则计数器缓存实际上无法工作,因为 Rails 无法更新它。

标签: ruby-on-rails ruby activerecord ruby-on-rails-5


【解决方案1】:

我不知道您说的是哪个 Rails 版本,但 counter_cache 选项将该列添加到模型的只读属性列表中。

摘自Rails guides

计数器缓存列通过 attr_readonly 添加到包含模型的只读属性列表中。

如果这不会阻止在创建期间写入列,您可以添加这样的回调(假设您的列名为books_count):

before_save :reset_books_count, if: :will_save_change_to_books_count?

def reset_books_count
  self.books_count = self.books_count_was
end

counter_cache 使用它时,该回调将被跳过,因为它在内部使用increment! 跳过回调。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-26
    • 1970-01-01
    • 2019-01-09
    • 2010-09-15
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多