Schienen has_many Bedingungen
c = "(f.profile_id = #{self.id} OR f.friend_id = #{self.id})"
c += AND + "(CASE WHEN f.profile_id=#{self.id} THEN f.friend_id ELSE f.profile_id END = p.id)"
c += AND + "(CASE WHEN f.profile_id=#{self.id} THEN f.profile_rejected ELSE f.friend_rejected END = 1)"
c += AND + "(p.banned = 0)"
Brauche ich diese in einer has_many-Beziehung so:
has_many :removed_friends, :conditions => ???
wie setze ich es selbst.id?, oder wie gebe ich dort die id?
Dann möchte ich die will_paginate plugin:
@profile.removed_friends.paginate(:page => 1, :per_page => 20)
Vielen Dank für Ihre Hilfe
EDIT:
class Profile < ActiveRecord::Base
has_many :friendships
has_many :removed_friends, :class_name => 'Profile', :through => :friendships, :conditions =>
"(friendships.profile_id = #{self.id} OR friendships.friend_id = #{self.id})"
"AND (CASE WHEN friendships.profile_id=#{self.id} THEN friendships.profile_rejected ELSE friendships.friend_rejected END = 1)" +
"AND (p.banned = 0)"
end
class Friendship < ActiveRecord::Base
belongs_to :profile
belongs_to :removed_friend, :class_name => 'Profile', :foreign_key => "(CASE WHEN friendships.profile_id = #{self.id} THEN friend_id ELSE profile_id END)"
end
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie einfache Anführungszeichen, die Bedingung:
id
Feld.Möchten Sie vielleicht, um diese brechen in eine Reihe von scopes, die angewendet werden kann, in Etappen statt alles auf einmal. Als ein Beispiel, extrahieren Sie den Verbotenen Teil:
Mit heavy-duty-Bedingungen in Beziehungen gebunden ist, um Probleme verursachen. Wenn möglich, versuchen Sie denormalizing der Tabelle, erstellen abgeleiteter Spalten, die "einfachen" Versionen der Daten, oder andere Dinge zu machen, Abfragen zu erleichtern.
Du hast wirklich zwei Beziehungen hier. Sie haben:
profile_id
Seitefriend_id
SeiteIch weiß nicht, warum sich beide Seiten lehnen eine Freundschaft, und vielleicht, die Sie benötigen, zu betrachten, Ihr Modell für ein bisschen hier (die Seite ist es anfordern? Wäre es besser, zu betrachten, die der Anforderer ABGEBROCHEN die Anfrage anstatt zu sagen, es wurde abgelehnt von der
profile
Seite?)Jedenfalls, ich würde dieses Modell als zwei separate Beziehungen, die Sie sind:
Dies ist eher unerwünscht, weil removed_friends ist keine Beziehung mehr, so dass Sie nicht tun können, Dinge wie
Profile.removed_friends.find(:all, :conditions => {:name => "bleh"})
mehr, aber das ist ein ziemlich komplizierter Fall. Diese Bedingung ist Recht Komplex.