rubyforen.de
http://forum.ruby-portal.de/

n:n :: Alle bekommen, zu denen Obj nicht gehört?
http://forum.ruby-portal.de/viewtopic.php?f=14&t=1192
Seite 1 von 1

Autor:  Josh [ 18 Nov 2005, 12:55 ]
Betreff des Beitrags:  n:n :: Alle bekommen, zu denen Obj nicht gehört?

Hallo alle

Ich habe X Users und X Organisatoren, wobei jeder User zu beliebig vielen Organisatoren gehören kann.
Nun erstelle ich eine Seite, auf welcher sich Benutzer bei Organisatoren anmelden können, um bei ihnen aufgenommen zu werden. Dabei möchte ich in @organisators alle Organisatoren speichern, zu welchen der User noch nicht gehört.
Gibt es dafür eine einfachere Variante, als die n:n Verbindungstabelle zu durchforsten? So etwas wie:



1
2
@user_belongs_to = @user.organisator
@user_does_not_belong_to = @user.organisator_not


Danke und Grüsse
Josh

Autor:  topo [ 19 Nov 2005, 08:22 ]
Betreff des Beitrags: 

Hi,

bau dir doch einfach ein ":belongs_not" selbst.

Du brauchst nichts weiter, als eine angepasste SQL-Abfrage.
Wenn es in einer Abfrage zu unübersichtlich wird, kannst du auch
einfach zwei Abfrageergebnisse voneinander abziehen.
(Schliesslich steht uns die gesamte Ruby-Power zur Verfügung)

Hier ein Beispiel aus meiner Applikation:

models/portfolio.rb



1
2
3
4
5
6
7
8
9
10
11
12

class Portfolio < ActiveRecord::Base
has_many :portfoliopositions

def self.find_unassigned_portfolios certificate_id
a = find_by_sql(["SELECT distinct b.id, b.name FROM portfoliopositions as a left join portfolios as b on b.id=a.portfolio_id
WHERE a.certificate_id = ?
"
, certificate_id] ) ;
b = find_by_sql "SELECT id, name from portfolios "
b - a
end
end



Das mag nicht der Weisheit letzer Schluss sein, funktioniert jedoch.

Um es zu übersetzen:
ein Certificate kann in beliebig vielen Portfolios existieren, Jedoch jewiels nur einmal. Portfoliopositions ist die Korrelationstabelle.

find_unassigned_portfolios listet alle Portfolios auf, die noch nicht infiziert sind.

Autor:  Josh [ 19 Nov 2005, 20:31 ]
Betreff des Beitrags: 

Okay, Danke dir! Hab nur gedacht, es gäbe eine bequemere Variante. Aber so wird's auch gehen. :-)

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/