Could you explain your problem more clearly? The rest was beautiful.

Blog: http://random8.zenunit.com/
Learn rails: http://sensei.zenunit.com/

On 05/02/2009, at 6:37 AM, Lake Denman <rails-mailing-l...@andreas- 
s.net> wrote:

>
> Hi, Thanks for taking a look at this. I am in need of some guidance  
> for
> a particular problem:
>
> My Requirements:
> The concept of a user
> The concept of a badge
>
> A badge is simply a small image over the user's avatar that displays
> extra information about the user.
> An admin user will be able to assign a badge to any user and the
> assigned badge will become the user's current badge, displayed for all
> the world to see.
>
> Not required for now but required in the future: a user will be able  
> to
> choose from a list of badges and create their own custom badges.
>
>
> The Way of the Lost:
>
> After toying with these requirements and bits of code for a few  
> days, I
> have decided to ask for help.
> Please enlighten me on a better, a more rails way of implementing  
> this.
> I am truly curious to know. There MUST be a better way!
>
>
> RELATIONSHIPS:
>
> I decided to implement the requirements by using a HasManyThrough
> association.
> I have three classes that collaborate: User, Badge, UserBadge
>
>  class User < ActiveRecord::Base
>    has_many :user_badges
>    has_many :badges, :through => :user_badges
>    has_one  :current_badge, :class_name => "UserBadge", :conditions =>
> { :current => true }
>  end
>
>  class Badge < ActiveRecord::Base
>    # t.string   :title
>    # t.string   :image_file_name
>    # t.string   :image_content_type
>    # t.integer  :image_file_size
>    # t.datetime :image_updated_at
>    # t.timestamps
>
>    has_many :user_badges
>    has_many :users, :through => :user_badges
>  end
>
>  class UserBadge < ActiveRecord::Base
>
>    #  t.integer :user_id
>    #  t.integer :badge_id
>    #  t.boolean :current, :default => false
>    #  t.timestamps
>
>    belongs_to :user
>    belongs_to :badge
>  end
>
> ASSIGNING A CURRENT BADGE:
>
> I need a way to assign a badge to a user, so I created an  
> attr_accessor
> in the User class called :assign_current_badge
> Then, I override the assign_current_badge setter method.
>
> The assign_current_badge=(badge_id) method:
>  * accepts a badge_id as a formal parameter
>  * updates any other current user_badges to "current=false" with the
> deactivate_badges method
>  * checks for existance of a user_badge with the user's id and  
> badge_id
>    * setting the user_badge.current to true if it exists
>    * creating and setting the user_badge.current to true if it does  
> not
> exist
>  * sets the user's current_badge_id to the badge_id
>
>
> class User < ActiveRecord::Base
>  ... # relationships
>
>  attr_accessor :assign_current_badge
>
>  def assign_current_badge=(badge_id)
>    deactivate_badges
>    if UserBadge.exists?(:user_id => id, :badge_id => badge_id)
>      user_badges.find_by_badge_id(badge_id).update_attribute(:current,
> true)
>    else
>      user_badges.create!(:badge => Badge.find(badge_id), :current =>
> true)
>    end
>    self.current_badge_id = badge_id
>  end
>
>  def deactivate_badges
>    user_badges.update_all("current = 0")
>  end
> end
>
> PROBLEMS I HAVE ENCOUNTERED:
>
>  The main problem I encounter is setting the current badge to a blank
> value through the user's edit form.
>  "Couldn't find Badge with ID=" is being raised since there really is
> no badge with a blank id.
>  This tells me, obviously, that there is a better way to go about  
> this.
> My gut tells me there is something shady about passing in the badge_id
> instead of an existing badge object.
>
>  - form_for @user, :url => admin_user_path(@user) do |f|
>    = f.error_message
>    # ... more fields
>    %div
>      = f.label :assign_current_badge
>      = f.select :assign_current_badge, Badge.all.map {|b| [b.title,
> b.id]}, { :selected => @user.current_badge_id, :include_blank =>  
> true }
>    # ... submit button
>
> Finale:
>  If you have any advice for me, please reply. Hopefully I explained my
> situation well enough through code and writing. If you would like me  
> to
> elaborate on anything, just ask.
> -- 
> Posted via http://www.ruby-forum.com/.
>
> >

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To post to this group, send email to rubyonrails-talk@googlegroups.com
To unsubscribe from this group, send email to 
rubyonrails-talk+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to