On Tue, Jan 3, 2012 at 11:55 PM, Linus P. <
[email protected]> wrote:
Thank you Peter. I have some follow up questions.
Let’s say I would use a scope. How could I do that? (let’s ignore the
“image_small” for now and focus on the subcategory) There is nothing in the
product table that I can use to select the completed products. It is only
regarded as completed if the related resellercategory is associated to a
subcategory. So, in the scope I would need to join the resellercategories
table and check if that is associated with a subcategory.
Well, this article
http://ablogaboutcode.com/2011/02/19/scopes-in-rails-3/
seems to indicate it can be done quite easily
class User
scope :by_age, lambda do |age|
joins(:profile).where(‘profile.age = ?’, age) unless age.nil?
end
scope :by_name, lambda{ |name| where(name: name) unless name.nil? }
scope :by_email, lambda do |email|
joins(:profile).where(‘profile.email = ?’, email) unless email.nil?
…
It joins user.profile to check on profile.age or profile.email …
I have not tested it, but seems not too difficult.
Feels a bit unnecessary to do that for a small thing as this. But maybe it
won’t affect the performance that much.
In my view, it is relevant, since it reduces the risk of cache
inconsistency, which
is a much harder problem to solve when your application grows. But I
have
had
discussions with colleagues on this before and some actually preferred
caching
such implicit caching columns in local tables, to have simpler reporting
on
those
tables later on (but the risk on inconsistency was always there).
The other option I was thinking of was just to add an after_filter in
resellercategory model like this:
def update_products
self.products.each(&:save)
end
Yes, this will work.
But for any implicit caching option (also the update_all), you need to
know
all the models
where the implicit product.complete cache is affected and have this
cache
update code
there (currently that would only be the ResellerCategory model, but it
can
grow).
The 3 options will work, but all have pros and cons:
- Product :complete scope (no implicit caching)
- Product update_all (sql level)
- ResellerCategory after_save update_products (ActiveRecord level, but
many
queries)
HTH,
Peter
–
Peter V.
http://twitter.com/peter_v
http://rails.vandenabeele.com