ruby on rails - Reset PK number based on association -


i have post , comments table.

post has many comments, , comment belongs post.

i want have primary keys start @ 1 when create comment post, can access comments in rest-ful manner, e.g:

/posts/1/comments/1 /posts/1/comments/2 /posts/2/comments/1 /posts/2/comments/2 

how can achieve rails 3? using mysql database.

bonus: using sequel orm; approach compatible sequel, not activerecord, awesome.

well, can't use id this, id primary key here. can add field database table comment_number , make unique in scope of post:

#migration def change   add_column :comments, :comment_number, :integer, null: false   add_index :comments, [:post_id, :comment_number], unique: true end  #class class comment < activerecord::base   belongs_to :post    validates :post_id, presence: true   validates :comment_number, uniqueness: { scope: :post_id }  end 

now in place need ensure column populated:

class comment < activerecord::base   #...    before_create :assign_comment_number    private    def assign_comment_number     self.comment_number = (self.class.max(:comment_number) || 0) + 1   end  end 

last step tell rails use column instead of id. need override to_param method:

class comment < activerecord::base   #...   def to_param     comment_number   end end 

update:

one more thing, useful make field read-only:

class comment < activerecord::base   attr_readonly :comment_id end 

also after rethinking having uniqueness validation on comment_number makes little sense having assigned after validations run. should rid of , rely on database index.

even having validation, there still possible condition race. override save method handle constraint validation exception retry couple of time ensure won't break application flow. topic question.


Comments

Popular posts from this blog

c++ - OpenCV Error: Assertion failed <scn == 3 ::scn == 4> in unknown function, -

php - render data via PDO::FETCH_FUNC vs loop -

The canvas has been tainted by cross-origin data in chrome only -