Ruby on rails Rails:除主ID之外的作用域ID

Ruby on rails Rails:除主ID之外的作用域ID,ruby-on-rails,scope,Ruby On Rails,Scope,假设我有很多博客,每个博客都有很多帖子。它们存储在两个表(“博客”和“帖子”)中。是否可以在blog表中添加一个额外的列(例如scoped_id),该表存储一个由blog确定范围的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,

假设我有很多博客,每个博客都有很多帖子。它们存储在两个表(“博客”和“帖子”)中。是否可以在blog表中添加一个额外的列(例如scoped_id),该表存储一个由blog确定范围的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可以跟踪父博客范围内的帖子数量。但是,如果帖子被销毁,我不希望
作用域id
减少。

是的,你肯定可以添加另一列,如果是我,我会在保存之前进行回调,以保存作用域id,如果它是新记录?

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

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

希望它有帮助=)

你最好的办法是在博客上保留最后使用的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
class Post
或者像那样的爵士乐


如果保存失败,计数器将不会增加,因为这是一个巨大的事务(就像完全是企业级的事务)。

谢谢,但是您如何确保父博客不会重复相同的作用域id?我将取最大的作用域id并将其增加1(替换分配作用域id方法):self.scoped_id=Post.max(:scoped_id)+1不要忘记在数据库中添加唯一索引:add_index:posts,[:id,:scoped_id],:unique=>true。否则(至少在理论上)可能会有两个同时的请求,并且最终可能会有两次相同的作用域_id。是的,为了防止竞争条件;-)一直以来,设备竞争条件不仅仅是理论上的,我可以从经验中告诉你:-)。当服务器同时处理两个请求时,此代码容易受到竞争条件的影响,这可能导致两个或多个博客条目具有相同的作用域id。例如,考虑下面的顺序:(1)请求Read StestOpStEdEdPasyId x,(2)请求B读取相同的RestestHyPixEdEdPasyId x,(3)请求一个SeopEdEdID到x+1,(4)请求b将StimeEdID ID设置为X+1(与请求A相同)。您可能期望在事务中保护这样的竞争条件,但它不会,除非将事务隔离级别设置得异常高(出于性能原因,这可能是个坏主意)。