如果用户已经属于“组”关系,则在迭代期间不显示用户

时间:2012-04-14 02:35:29

标签: ruby-on-rails ruby-on-rails-3

我有这种关系,用户可以创建文档(旅行)并邀请其他用户访问属于该文档的组。我的关系表明“Group”有一个user_id和trip_id列,因此对于我邀请的每个用户,都会在数据库中创建一个新的Group记录。

当我邀请其他用户时,我只希望显示不在该组中的用户。已经在该组中的用户不应该出现,但我的视图仍然显示用户。

我一直在玩<% if !friend.trips.include?(@trip)%>,但我似乎无法得到正确的观点。正在数据库中正确创建记录。

此外,当我查看groups / new.html.erb时,这是网址http://localhost:3000/groups/new?id=2,其中id是trip_id。

我的问题:

  1. 我是否使用了宁静的约定?也就是说,我应该在这里使用新方法(按原样)还是应该使用索引方法?
  2. 如何遍历每个朋友的群组,以确保该群组的trip_id都不等同于@ trip.id?
  3. 谢谢!

    查看(/groups/new.html.erb)

    <% if !@friends.blank? %>
      <% @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
    

1 个答案:

答案 0 :(得分:1)

首先,您在has_many :trips模型中调用了两次User。我们了解到,您有两种不同类型的User - Trip关系(一种直接,一种通过Group),但您不能同时使用相同的名称,否则会隐藏其他。尝试像这样定义User模型:

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

还有一个问题是,您正在friend的{​​{1}} groups列表中搜索Trip个对象。尝试将该行更改为:

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

或者没有新方法,这样的事情应该有效:

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

我没有看到任何关于你的方法的非RESTful。 RESTful通常意味着无国籍。即响应唯一依赖的是HTTP方法和地址。因此,只要您不将状态信息保存在会话中,就应该遵循REST。