I’m not sure if there is a term for this (which is why I can’t find
anything on google) but I want to be able to set one of my models
active, where the rest will be set to inactive.
I would guess to write a method that sets all the records to inactive,
then set the selected object to active. That seems like it’s pretty
messy though. Is there some sort of built-in functionality with rails
that will only allow one column to be true at a time?
I have a project model. What I’d like to do is set a project to
“featured” so I can display that on the homepage. By marking a project
as featured, I’d want all the other projects to automatically have
their “featured” column set to false.
Then you can FeaturedProduct.find(:first) and be sure that there is
only one. No need to mess with the projects when the featured one
changes. However, you might want to do:
class Project
after_destroy :clean_up_if_featured
def clean_up_if_featured
fp = FeaturedProject.find(:first)
if fp && fp.project_id == self.id
fp.destroy
else
true
end
end
end
Although that might be equivalent to:
class Project
has_one :featured_project, :dependent => :destroy
end
-Rob
On Feb 18, 2009, at 12:43 PM, yaphi wrote:
point of view.
I’m not sure if there is a term for this (which is why I can’t find
anything on google) but I want to be able to set one of my models
active, where the rest will be set to inactive.
I would guess to write a method that sets all the records to
inactive,
then set the selected object to active. That seems like it’s pretty
messy though. Is there some sort of built-in functionality with
rails
that will only allow one column to be true at a time?
Well, I don’t know if a Project makes itself featured, but that’s your
dilemma.
In any case, it would be something that a controller action calls on
either a Project instance (@project.feature_me) or the FeaturedProduct
model (FeaturedProject.is_now(@project)).
Where you might have:
class FeaturedProject
def self.is_now(a_project)
fp = find(:first) || new
fp.project = a_project
fp.save
end
end
-Rob
On Feb 18, 2009, at 4:16 PM, yaphi wrote:
class FeaturedProject < ActiveRecord::Base
Then you can FeaturedProduct.find(:first) and be sure that there is
else
that’s exactly what I want…didn’t know about update_all! Thanks I’ll
try it when I get back tonight.
That sucks.
You can only have one featured row in your table.
Why would you identify this row by marking all your rows one way or
another (you will need to index this column (at some point) also) when
all you need to store (somewhere) is the id of the current featured row
? This is an heavyweight solution to a flyweight problem.
Create a control/settings table/model that has an attribute
“current_featured_project_id” and access it via that (as shown already).
You might find other single settings values etc… that you can add to
this table later.