Howdy, I have a couple questions on the best way to model things in
rails.
1. How to model a table so an admin person can selectively turn on/
off hard/soft deletes from a table at a table level?
2. Model a parent/child relationship that can go infinitely deep.
specifically equipment, parent => child => child => child ....
2. Model a parent/child relationship that can go infinitely deep.
specifically equipment, parent => child => child => child ....
Use acts as tree plugin
Hell no! acts_as_tree should be avoided at all costs. The adjacency
list model that it uses is simple, naïve, and inefficient: each level of
the tree requires a separate query (unless you're using Oracle, which
has a proprietary extension to its SQL that fixes this).
What you want instead is a *nested set* or *nested interval* structure
(do a Web search for articles on how these work). These allow retrieval
of an entire tree, to arbitrary depth, with a single query. Rails
plugins exist for both. acts_as_nested_interval was buggy last time I
used it, but has probably been fixed by now. awesome_nested_set lives
up to its name.
--
Cheers,
Bala
RoR Developer Now Available for Hire
The fact that you're recommending acts_as_tree means that people ought
to think twice about hiring you...
2. Active Record Associations — Ruby on Rails Guides
Here check has_many :through , has_and_belongs_to_many assotiations,
and I think you may need polymorphic association. You have to try them
out, but there are some help in the tutorial to make decision.
I'm not sure if I understand well your first question, can you write
it more clearly please?
2. Active Record Associations — Ruby on Rails Guides
Here check has_many :through , has_and_belongs_to_many assotiations,
and I think you may need polymorphic association. You have to try them
out, but there are some help in the tutorial to make decision.
Nope. All you need is awesome_nested_set.
I'm not sure if I understand well your first question, can you write
it more clearly please?
Hell no! acts_as_tree should be avoided at all costs. The adjacency
list model that it uses is simple, naïve, and inefficient: each level of
the tree requires a separate query (unless you're using Oracle, which
has a proprietary extension to its SQL that fixes this).
What you want instead is a *nested set* or *nested interval* structure
(do a Web search for articles on how these work). These allow retrieval
of an entire tree, to arbitrary depth, with a single query. Rails
plugins exist for both. acts_as_nested_interval was buggy last time I
used it, but has probably been fixed by now. awesome_nested_set lives
up to its name.
Although nested sets make inserts very expensive. Like most data
modelling questions, the sort of access patterns that will be used -
while acts as tree makes getting a whole subtree expensive, if you
never need to do that in your app, who cares?
used it, but has probably been fixed by now. awesome_nested_set lives
up to its name.
Although nested sets make inserts very expensive.
So use nested intervals instead. They fix that problem completely.
Like most data
modelling questions, the sort of access patterns that will be used -
while acts as tree makes getting a whole subtree expensive, if you
never need to do that in your app, who cares?
If you never need a whole subtree, you probably don't need a tree
structure in the first place (though there are exceptions).