When I began learning rails I found it frustrating that array and active
record relation objects could not be queried in the same fashion as
database tables. Before too much confusion let me explain.
When I want something from a database table I simply write something
like:
Product.where(:color=>‘black’) NOW, if I put a .to_sql after that
statement
I see something like “SELECT "styles".* FROM "styles" WHERE
"styles"."color" = ‘black’”
So clearly, rails is magically converting that friendly statement into
something more meaningful to the backend. That’s fantastic and makes my
life wonderful.
So here’s my problem… after running the query I am returned an active
record relation, which let’s say is called @products. Now, let’s say I
want
to further break that list of products into products that are big and
small. This would require one of two things… either I must hit the
database twice being more selective, or I must iterate over @products
using
a block and such ruby magic as collect/map/select/etc…
To me neither of the above is a great option, and I must admit while
learning ruby on rails this was one of the biggest stumbling blocks for
me,
and one that has produced a massive amount of stackoverflow headaches
for
many others.
My suggestion to rails developers is to make rails more accessible to
beginners by allowing programmers to apply the same simplicity of
writing
an active record query to querying an active record relation object or
array of model objects.
For example, I want to now take @products and say:
@products.where(:size=>“small”) and have this converted automagically by
rails to the appropriate statement @products.select{|product|
product.size
== ‘small’}
I suppose this could work if rails were to query the object type first
before performing the query. Is the object type an array or active
record
relation, and is it in the expected format (collection of appropriate
objects)? If it is, then treat it as a virtual table and instead of
performing an sql query, hit it with a select block, etc.
I know understanding the underlying ruby code is good, and at times
would
be preferable to using active record style commands… but for new users
getting off the ground, I think having both options would be beneficial.
Also, I feel it would be more consistency to the framework generally.
I have also posted this at reddit
http://www.reddit.com/r/rails/comments/12kyho/suggestion_for_rails_4_what_are_pros_and_cons/