Forum: Ruby on Rails One model active at a time

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
11333f97a96662abe5d1e44fe1adf372?d=identicon&s=25 yaphi (Guest)
on 2009-02-18 02:14
(Received via mailing list)
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?
A91bd6cef23eb3516245a092e196c4da?d=identicon&s=25 Maurício Linhares (mauricio)
on 2009-02-18 02:56
(Received via mailing list)
No, there isn't. Maybe you're approaching the problem from the wrong
point of view.

Try to explain what is your problem that someone else might give you a
better idea.

-
Maurício Linhares
http://alinhavado.wordpress.com/ (pt-br) | http://blog.codevader.com/
(en)
11333f97a96662abe5d1e44fe1adf372?d=identicon&s=25 yaphi (Guest)
on 2009-02-18 18:44
(Received via mailing list)
Hey Maurício,

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.

On Feb 17, 8:55 pm, Maurício Linhares <mauricio.linha...@gmail.com>
Ef3aa7f7e577ea8cd620462724ddf73b?d=identicon&s=25 Rob Biedenharn (Guest)
on 2009-02-18 20:09
(Received via mailing list)
Why not have a:

class FeaturedProject < ActiveRecord::Base
   belongs_to :project

   before_create :only_have_one
   validates_associated :project

   def only_have_one
     self.class.count < 1
   end
end

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?

Rob Biedenharn    http://agileconsultingllc.com
Rob@AgileConsultingLLC.com
11333f97a96662abe5d1e44fe1adf372?d=identicon&s=25 yaphi (Guest)
on 2009-02-18 22:17
(Received via mailing list)
Interesting...So I'd have a method in my Project model that sets the
FeaturedProject.

I'll play with this and see how it goes. Thanks!

On Feb 18, 2:08 pm, Rob Biedenharn <R...@AgileConsultingLLC.com>
Ef3aa7f7e577ea8cd620462724ddf73b?d=identicon&s=25 Rob Biedenharn (Guest)
on 2009-02-18 22:57
(Received via mailing list)
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
>>
>>> project
>>>> you a
>>>>> anything on google) but I want to be able to set one of my models
>> Rob Biedenharn          http://agileconsultingllc.com
>> R...@AgileConsultingLLC.com
> >

Rob Biedenharn    http://agileconsultingllc.com
Rob@AgileConsultingLLC.com
11333f97a96662abe5d1e44fe1adf372?d=identicon&s=25 yaphi (Guest)
on 2009-02-19 13:37
(Received via mailing list)
I've been thinking more about this, and instead of doing a whole new
model, couldn't I do something like this in my Project model?

before_save :set_if_featured

def set_if_featured
  articles = Article.find(:first, :conditions => ["featured = ?",
true])
  article.featured = false
  featured = true
end

On Feb 18, 4:49 pm, Rob Biedenharn <R...@AgileConsultingLLC.com>
D6434aa0b7b350f8c3ed0119d81b2ead?d=identicon&s=25 Roy Pardee (rpardee)
on 2009-02-19 21:34
(Received via mailing list)
How about a class method that takes the to-become-featured project as an
argument?  Something like:

class Project < AR:Base
  validates_uniqueness_of :featured

  def self.make_featured(this_project)
    self.update_all("featured = false")
    this_project.featured = true
    this_project.save!
  end
end
11333f97a96662abe5d1e44fe1adf372?d=identicon&s=25 yaphi (Guest)
on 2009-02-19 21:44
(Received via mailing list)
that's exactly what I want...didn't know about update_all! Thanks I'll
try it when I get back tonight.
613340c5fef56ad6fc3bf8cc617266ae?d=identicon&s=25 Andrew Porter (Guest)
on 2009-02-20 17:44
(Received via mailing list)
yaphi wrote:
> 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.
11333f97a96662abe5d1e44fe1adf372?d=identicon&s=25 yaphi (Guest)
on 2009-02-20 17:56
(Received via mailing list)
OK I see what you're saying. That's much simpler and more future
proof. Thanks again!
This topic is locked and can not be replied to.