Rails 3 - Использование тегов для связывания фотографий с полиморфным классом Taggable - PullRequest
2 голосов
/ 22 декабря 2011

Моя цель - создать систему для связывания фотографий с объектами из любого из нескольких классов (События, Организации, Разработки) с использованием тегов.Что касается меня, я не могу заставить это работать, несмотря на то, что это кажется довольно распространенной ситуацией.

Я относительно новичок во всем, кроме самой базовой разработки RailsПоэтому мне трудно сформулировать вопрос.Прошу прощения за любые ошибки.

Модель метки:

class Tag < ActiveRecord::Base
  attr_accessible :photo_id, :taggable_id, :taggable_type

  belongs_to :photo
  belongs_to :taggable, :polymorphic => true
end

Фотомодель:

class Photo < ActiveRecord::Base
  attr_accessible :tags_attributes
  has_many :tags, :dependent => :destroy
  accepts_nested_attributes_for :tags, :reject_if => lambda { |a| a[:taggable_id].blank? }
end

Модель события:

class Event < ActiveRecord::Base
  has_many :tags, :as => :taggable, :dependent => :destroy
end

Модель организации:

class Organization < ActiveRecord::Base
  has_many :tags, :as => :taggable, :dependent => :destroy
end

Модель разработки:

class Development < ActiveRecord::Base
  has_many :tags, :as => :taggable, :dependent => :destroy
end

В моих полях Фото я пытаюсь использовать камень nested_form для добавления тегов к фотографии(чтобы позже я мог вызывать эти помеченные объекты в представлениях фотографии, а фотографию - в представлениях помеченных объектов).

photos / new.html.erb (я включил nested_form javascript)

<% nested_form_for @photo, :html => { :multipart => true } do |f| %>
  ...
  <%= f.fields_for :tags do |tag_form| %>
    <%= tag_form.collection_select :taggable_id, Taggable.all, :id, :name %>
    <%= tag_form.link_to_remove "remove" %>
  <% end %>
  <p><%= f.link_to_add "Add tag", :tags %></p>
  ...
  <% f.submit "Add photo" %>
<% end %>

Подходит ли структура моих моделей для того, что я пытаюсь сделать?

и, если да,

Как можноЯ правильно указал и he: taggable_id и: taggable_type в моей вложенной форме?

Заранее спасибо за любые рекомендации!

1 Ответ

0 голосов
/ 22 декабря 2011

Вы должны сделать вашу модель Photo полиморфной и использовать что-то вроде attachment_fu / paperclip для загрузки фотографий.

class Photo < ActiveRecord::Base

  has_attachment :content_type => :image,
                 :storage => :file_system,
                 :max_size => 2000.kilobytes,
                 :resize_to => '500x500>',
                 :thumbnails => { :thumb => '215x215>'}

  validates_as_attachment

  belongs_to :attachable, :polymorphic => true
end

class Event < ActiveRecord::Base
  has_many :tags, :as => :taggable, :dependent => :destroy
  has_many :attachments, :as => :attachable
end

class Organization < ActiveRecord::Base
  has_many :tags, :as => :taggable, :dependent => :destroy
  has_many :attachments, :as => :attachable
end

class Development < ActiveRecord::Base
  has_many :tags, :as => :taggable, :dependent => :destroy
  has_many :attachments, :as => :attachable
end

В вашей таблице фотографий должны быть столбцы attachable_id и attachable_type.При этом вы сможете добавлять фотографии в разные объекты, хранящиеся в полиморфной фотомодели.Маркировка также использует полиморфные ассоциации и работает аналогичным образом.документация для плагина поможет.Надеюсь, что это работает для вас.

...