1

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

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

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

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

我的问题:

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

谢谢!

查看 (/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

用户.rb

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

行程.rb

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

  has_many :users, :through => :groups
end

组.rb

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

1 回答 1

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的列表。尝试将该行更改为:groupsTrip

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

或者没有新方法,这样的东西应该可以工作:

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

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

于 2012-04-14T03:31:24.707 回答