5 Stimmen

Rails-Verknüpfungen - Ideen für bewährte Praktiken

Eine Frage zu Rails-Verknüpfungen.
Betrachten Sie die folgenden Modelle:

  • Menschen

  • Ereignisse

  • Bilder

Menschen und Ereignisse können viele Bilder haben.
Bilder, die zu einem Ereignis hochgeladen wurden, müssen die Möglichkeit haben, mit mehreren Personen in Verbindung gebracht zu werden.

Dies bedeutet, dass es zwei Beziehungen zwischen Menschen und Bildern gibt.
Eine, bei der Bilder direkt auf die Person hochgeladen werden. Und eine, bei der eine Person in einem Ereignis markiert ist.

Kann es auch eine Beziehung zwischen einer Person und einem Ereignis geben, basierend darauf, dass sie in einem (oder mehreren) Bildern in einem Ereignis markiert wurden? In dieser Hinsicht handelt es sich um eine Art Bildmarkierungssystem, bei dem Verknüpfungen aufgrund dessen erstellt werden, in welchem Ereignis Personen markiert sind.

Fragen Sie sich, was in Rails die beste Praxis ist, um diese Verknüpfung zu erstellen? Jede Hilfe oder Ratschläge sind sehr willkommen!

2voto

sarvavijJana Punkte 1202

Ich bin mir nicht absolut sicher über die beste Praxis, aber es besteht die Möglichkeit, Ihr Problem auf einfache Weise zu lösen, so weit ich Sie verstehe:

Wir haben:

Event ... hat viele :Fotos; Foto ... gehört zu :Event

und die Lösung besteht darin, eine Zwischenklasse ActiveRecord zu erstellen

Menschen ... hat viele :Fotos, :über photo_mappings

PhotoMapping ... gehört zu :Benutzer; gehört zu :Foto

Schöne AR Assoziationen beste Praxis1

1voto

nathanvda Punkte 48972

In Rails ist es auf jeden Fall möglich, eine Join-Tabelle mit zusätzlichen Feldern zu definieren. In diesem Fall würde ich die folgende Tabelle definieren:

class LinkedImage
  belongs_to :person
  belongs_to :image

  OWNER=1
  TAGGED=2

  validates :relation_type, :inclusion => {:in => [OWNER, TAGGED]}
end

Diese Tabelle würde ein Bild mit einer Person verknüpfen und ein zusätzliches Feld relation_type haben (man könnte vielleicht über einen passenderen Namen nachdenken), das jetzt zwei Werte haben kann: 1 (für den OWNER, was bedeutet, dass das Bild direkt für die Person hochgeladen wurde) und 2 (die Person ist im Bild markiert). Abgesehen von der Beziehung möchten Sie vielleicht etwas Zusätzliches speichern, wie die Position im Bild, einen Zusatzkommentar, den Sie hier ebenfalls leicht hinzufügen könnten.

Und die Person würde so aussehen:

class Person
  has_many :linked_images
  has_many :uploaded_images, :class_name => Image, 
                             :through => :linked_images, 
                             :conditions => "relation_type=#{LinkedImage::OWNER}"
  has_many :tagged_in_images, :class_name => Image,
                              :through => :linked_images,
                              :conditions => 'relation_type=#{LinkedImage::TAGGED}"
end 

Und der Code für Image könnte ähnlich sein.

Ich hoffe, das hilft.

-1voto

cicloon Punkte 1111

Ich weiß nicht, ob das der beste Ansatz ist, aber ich würde etwas Ähnliches tun:

class User < ActiveRecord::Base
  has_many :images, :as => :owner
  has_many :tags
  has_many :tagged_images, :through => :tags, :source => :image

  has_many :tagged_events, :finder_sql => %q( SELECT `events`.* FROM `events`, `images` WHERE `events`.id = `images`.owner_id AND `images.owner_type ="Event" `
                                    WHERE (`images`.id IN (#{tagged_image_ids.join(',')}) ))

end

class Event < ActiveRecord::Base
  has_many :images, :as => :owner

  has_many :tagged_users, :finder_sql => %q( SELECT `users`.* FROM `users`, `images` WHERE `users`.id = `images`.owner_id AND `images.owner_type ="User" `
                                    WHERE (`images`.id IN (#{image_ids.join(',')}) ))

end

class Tag < ActiveRecord::Base
  belongs_to :user
  belongs_to :image  
end

class Image < ActiveRecord::Base
  belongs_to :owner, :polymorphic => true
  has_many :tags
  has_many :tagged_users, :through => :tags, :source => :user

Hinweis: Die Verwendung von finder_sql ist in Rails nicht optimal, da es beispielsweise nicht erlaubt, neue markierte Bilder nur unter Verwendung der Beziehung hinzuzufügen, aber es funktioniert gut für das Lesen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X