ruby on rails - Eager load associations in nested set model -
i'm using nested set represent nested comments (1 discussion has many comments, comments can replied to) , (if possible) eager load answers comments.
at moment load root nodes , iterate on them, if have descendants render them. however, if there lot of root nodes answers, triggers lot of db requests.
a comment has these columns: rgt, lft, parent_id
i tried create relationship this:
class comment < activerecord::base has_many :answers, -> (node) { where("lft > ? , rgt < ?", node.lft, node.rgt) }, class_name: "comment", foreign_key: :parent_id end
this fetches answers comment when called on comment instance. however, if try eager_load (discussion.comments.includes(:answers)
) blows since node
nil.
is possible eager load this?
i think, i've found solution. if see right, data model looks this:
discussion ---------- ... comment ---------- discussion_id:int parent_id:int lft:int rgt:int
then ar model classes be:
class discussion < activerecord::base has_many :comments end class comment < activerecord::base belongs_to :discussion end
to eager load discussion (id == 1) tree of comments , answers use:
d = discussion.includes(:comments).find(1)
this gives collection of comments given discussion in memory (d.comments
).
now can manipulate collection answers particular comment without additional db queries. add discussion
class:
def comment_roots self.comments.select {|c| c.parent_id.nil? } end
and comment
class:
def answers self.discussion.comments.select {|c| c.parent_id = self.id } end def answers_tree self.discussion.comments.select {|c| self.lft < c.lft && c.rgt < self.rgt } end
example:
d.comment_roots.first.answers
Comments
Post a Comment