Как использовать ActiveResource с пользовательской схемой URL? - PullRequest
1 голос
/ 16 мая 2009

Я пытаюсь создать ActiveResource объекты для трех объектов во внутреннем приложении.

Есть Tag с, Tagging с и Taggable с:

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

Tag 's :tag - текстовый тег с буквенным кодированием URL. Tagging s :id - это автоинкрементное целое число. Taggable s :type является строкой. Не существует конечного набора типов тегов - служба может поддерживать тегирование чего угодно. Taggable s :key - это поле идентификатора, которое назначает служба для типа Taggable. Это может быть коммерческая ценность, например, имя пользователя emplyee, или просто целое число с автоинкрементом.

Если бы это были ActiveRecord объекты, я бы кодировал их примерно так:

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

Кто-нибудь знает, что эти классы хотели бы в ActiveResource? Спасибо!

1 Ответ

1 голос
/ 31 августа 2010

Вы используете Rails 3.0? Если это так, то теперь вы можете сделать почти то же самое в ActiveResource.

Если нет, попробуйте воспользоваться гиперактивным ресурсом: http://github.com/taryneast/hyperactiveresource

Что я расширил, чтобы заставить ActiveResource работать почти так же, как Active Record. Он поддерживает ассоциации, как и AR - хотя он не поддерживает "через" - вам, возможно, придется вручную кодировать, например, для Baz, который has_many: foos,: through =>: bars вы бы сделали:

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