2012-04-14 4 views
1

Ich habe diese Beziehung, in der Benutzer ein Dokument (Reise) erstellen und andere Benutzer zu einer Gruppe einladen kann, die zu diesem Dokument gehört. Meine Beziehung zeigt an, dass "Gruppe" eine Spalte user_id und trip_id aufweist. Daher wird für jeden Benutzer, den ich einlade, ein neuer Gruppendatensatz in der Datenbank erstellt.Benutzer während Iteration nicht anzeigen, wenn Benutzer bereits zur "Gruppen" -Beziehung gehört

Wenn ich andere Benutzer einlade, möchte ich nur Benutzer anzeigen, die NICHT in der Gruppe sind. Benutzer, die bereits in der Gruppe sind, sollten nicht angezeigt werden, aber meine Ansicht zeigt immer noch die Benutzer an.

Ich habe mit <% if !friend.trips.include?(@trip)%> herum gespielt, aber ich kann nicht scheinen, die richtige Ansicht zu bekommen. Der Datensatz wird korrekt in der Datenbank erstellt.

Auch, wenn ich Gruppen/new.html.erb anzeigen, ist dies die URL http://localhost:3000/groups/new?id=2, wo die ID ist die trip_id.

Meine Frage:

  1. Bin ich ruhig Konvention? Das heißt, sollte ich die neue Methode hier verwenden (wie es ist) oder sollte ich stattdessen die Indexmethode verwenden?
  2. Wie wiederhole ich die Gruppen der einzelnen Freunde, um sicherzustellen, dass keine trip_id der Gruppe äquivalent zu @ trip.id ist?

Vielen Dank!

Ansicht (/groups/new.html.erb)

<% if [email protected]? %> 
    <% @friends.each do |friend| %> 
    <% if !friend.trips.include?(@trip)%> 
      <%= link_to groups_path(:user_id => friend.id, :trip_id => @trip.id), 
            :method => :post, :action => 'create' do %> 
      <div id="addfriend_totrip_button_groupsnew">add friend to trip</div> 
      <% end %> 
    <% end %> 
    <% end %> 
<% end %> 

groups_controller.rb

class GroupsController < ApplicationController 
before_filter :authenticate, :only => [:update, :create, :destroy] 

    def new 
    @trip = Trip.find(params[:id]) 
    @user = User.find(current_user) 
    @group = Group.new 
    @friends = @user.friends.all 
    end 

    def create 
    @trip = Trip.find(params[:trip_id]) 
    @user = User.find(params[:user_id]) 
    @group = Group.create(:user_id => @user.id, :trip_id => @trip.id) 

    if @group.save 
     flash[:success] = "Friend added to group." 
     redirect_to groups_path(:id => @trip.id) 
    else 
     flash[:error] = "Could not add friend." 
     redirect_to root_path 
    end 
    end 

end 

user.rb

class User < ActiveRecord::Base 
    has_many :trips, :through => :groups 
    has_many :trips, :dependent => :destroy 
    has_many :groups 
end 

trip.rb

class Trip < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :traveldeal 
    has_many :groups 

    has_many :users, :through => :groups 
end 

group.rb

class Group < ActiveRecord::Base 
    belongs_to :trip 
    belongs_to :user 
end 

Antwort

1

Zunächst einmal haben Sie has_many :trips zweimal in Ihrem User Modell genannt. Ich verstehe, dass Sie zwei verschiedene Arten von User - Trip Beziehungen haben (eine direkt, und eine durch Group), aber Sie können nicht beide den gleichen Namen geben, sonst wird man den anderen verstecken. Versuchen Sie, Ihre User Modell wie folgt definieren:

class User < ActiveRecord::Base 
    has_many :group_trips, :through => :groups, 
         :class_name => "Trip" 
    has_many :trips, :dependent => :destroy 
    has_many :groups 

    def all_trips 
    Trip.joins(:groups).where({:user_id => self.id} | {:groups => {:user_id => self.id}}) 
    end 
end 

Es gibt auch das Problem, dass Sie die friend ‚s Liste der groups für ein Trip Objekt gesucht werden soll. Versuchen Sie diese Zeile zu ändern zu:

<% if !friend.all_trips.include?(@trip) %> 

oder ohne die neue Methode, so etwas wie das funktionieren soll:

<% if !friend.groups.where(:trip_id => @trip.id).first %> 

ich nichts un-RESTful über Ihren Ansatz sehen. RESTful im Allgemeinen bedeutet staatenlos. I.e. Die einzige Antwort hängt von der HTTP-Methode und der Adresse ab. Solange Sie also keine Statusinformationen in der Sitzung speichern, sollten Sie REST befolgen.

+0

Ich versuchte mit '<% ​​if! Friend.trips.include? (@ Trip)%>' aber es hat nicht funktioniert. Alle Benutzer wurden weiterhin angezeigt. Ihre andere Lösung '<% if! Friend.groups.where (: trip_id => @ trip.id) .first%>' hat funktioniert. Was macht zuerst? – Huy

+0

Glaubst du, dass der erste wegen meiner Routen nicht funktioniert hat? – Huy

+0

'.first' zieht nur den ersten aus der Datenbank. Es stellt sicher, dass Sie die Abfrage tatsächlich ausgeführt haben und sich mit dem Objekt befassen. Wenn Sie es nicht tun würden, würden Sie in allen Fällen mit einem Arel-Objekt zu tun haben, das immer als "wahr" betrachtet wird. – tsherif

Verwandte Themen