How do I implement "rotating" content on a website?

If highlighting a certain item on the front page can be random, I would suggest a much easier solution (assuming your using MySQL, don’t know if the other DBMS support this):

@featured_blog = Blog.find(:first, :order => “RAND()”)

@featured_book = Book.find(:first, :order => “RAND()”)

Add conditions if you want to limit the number of records, e.g. @featured_blog = Blog.find(:first, :conditions => [“updated_at > ?”, Date.today.last_month], :order => “RAND()”)

This basically translates to “SELECT * FROM blogs LIMIT 1 ORDER BY RAND()”, it tells MySQL to fetch 1 single random record out of the resultset.

Best regards

Peter De Berdt

Hi, Peter. This was a great solution! I've already implemented this as
an interim solution for the next couple of months since our site hasn't
officially launched and it'll be a couple/few months till we begin
getting a lot of traffic.

In the long run, I would like to give everyone precisely equal exposure.
Also, I wonder if there is a better solution for faster performance
using memory versus database calls.

But again, for now, thanks a ton for your help! I have all the
rotations working for now and it was very easy to implement since I
simply had to add the ":order => "RAND()" stuff since I was already
making :find(:first) calls.

Be careful using RAND() if your dataset is large. You don't want to
randomly order a million rows only to retrieve one of them. By doing the
above you're forcing the database to consider every row in the table every
time. If you have a lot of rows you may want to do this

- get total row count from db
- in ruby get a random number from 0 to the total row count
- fetch a row ordered by a primary key limit 1 offset that random number.

While two queries, it will lower the impact on the database a lot.

anyway, something to keep in mind in case your data gets big.