2009-05-16 4 views
1

J'essaie de créer ActiveResource objets pour trois objets dans une application interne.Comment utiliser ActiveResource avec un schéma d'URL personnalisé?

Il y a Tag s, Tagging s et Taggable s:

http://tagservice/tags/:tag 
http://tagservice/taggings/:id 
http://tagservice/taggables/:type/:key 

Tag « s :tag est l'URL codé texte de balise littérale. :id est un entier auto-incrémenté. Taggable:type est une chaîne de caractères. Il n'y a pas d'ensemble fini de types de taggable - le service peut supporter n'importe quoi. Taggable:key est le champ ID que le service pour ce type de Taggable attribue. Il peut s'agir d'une valeur commerciale, comme le nom d'utilisateur d'un employé, ou simplement d'un entier auto-incrémenté.

Si ceux-ci étaient des objets ActiveRecord, je les code quelque chose comme ceci:

class Tag < ActiveRecord::Base 
    has_many :taggings 
    has_many :taggables, :through => :taggings 
    def self.find_by_id(id) 
    find_by_name(id) 
    end 
    def to_param 
    CGI::escape(self.name) 
    end 
end 

class Tagging < ActiveRecord::Base 
    belongs_to :tag 
    belongs_to :taggable 
end 

class Taggable < ActiveRecord::Base 
    has_many :taggings 
    has_mnay :tags, :through => :taggings 
    def self.find_by_id(id) 
    find_by_type_and_key(*id.split('/')) 
    end 
    def to_param 
    "#{self.type}/#{self.key}" 
    end 
end 

Est-ce que quelqu'un sait ce que ces classes aimeraient comme dans ActiveResource? Merci!

+0

Est-ce que ma réponse a aidé? Si oui, pouvez-vous l'accepter s'il vous plaît? :) Si non - laissez-moi savoir ce que vous avez finalement fait. –

Répondre

1

Utilisez-vous Rails 3.0? Si c'est le cas, vous pouvez presque faire exactement la même chose dans ActiveResource maintenant.

Sinon, pensez à essayer ressources hyperactif: http://github.com/taryneast/hyperactiveresource

Ce que j'étendu pour rendre le travail de ActiveResource presque le même que Active Record. Il supporte les associations, tout comme AR - bien qu'il ne supporte pas "through" - vous devrez peut-être coder à la main par exemple pour un Baz qui a beaucoup: foos,: through =>: bars vous feriez:

# ugly, but does the job 
def foos 
    return [] unless bars.present? 
    foo_set = [] 
    self.bars.each {|b| foo_set += b.foos } 
    foo_set 
end