Rails:除了主要ID之外的Scoped ID

时间:2009-09-01 07:53:01

标签: ruby-on-rails scope

假设我有很多博客,每个博客都发布has_many个帖子。这些存储在2个表中(“博客”和“帖子”)。是否可以在博客表中添加一个额外的列(例如scoped_id),该博客表存储由博客确定的ID。

实施例

 Blog: 1
  - Posts
    - id: 1, scoped_id: 1
    - id: 2, scoped_id: 2
    - id: 3, scoped_id: 3
 Blog: 2
  - Posts
    - id: 4, scoped_id: 1
    - id: 5, scoped_id: 2
    - id: 6, scoped_id: 3

我知道counter_cache可以跟踪父博客确定的帖子数量。但是,如果帖子被销毁,我不希望scoped_id减少。

2 个答案:

答案 0 :(得分:1)

是的,你绝对可以添加另一列,如果是我,我会做一个 before_save 回调来保存 scoped_id ,如果它是 new_record?

class Post < ActiveRecord::Base
  ...
  before_save :populate_scoped_id

  def populate_scoped_id
    assign_the_scoped_id_method if self.new_record?
  end
  ...
end

希望它有帮助=)

答案 1 :(得分:1)

您最好的选择是将最后使用的ID保留在博客上,并通过以下方式填写:

class Post < ActiveRecord::Base
  …
  before_create :populate_scoped_id

  def populate_scoped_id
    blog.increment!(:latest_scoped_post_id)
    self[:scoped_id] = blog.latest_scoped_post_id
  end
  …
end

或类似的爵士乐。

如果保存失败,计数器将不会递增,因为它只是一个非常棒的交易(就像完全是企业一样)。