在轨道上的ruby中有has_and_belongs_to_many关系

时间:2014-04-03 15:43:33

标签: ruby-on-rails ruby

我正在尝试使用红宝石在铁轨上为网球教练建立一个网站。我对此完全陌生,我正在努力学习一些术语。该网站有一个登录系统,用户可以登录,然后注册网球教练创建的不同活动。因此,基本上用户可以参加许多活动,并且活动可以有许多用户参加。我在用户表和事件表之间建立了has_and_belongs_to_many关系,代码如下:

这是我的迁移:

class CreateEventsUsers < ActiveRecord::Migration
    def change
      create_table :events_users, :id => false do |t|
        t.integer :event_id
        t.integer :user_id
      end

      add_index :events_users, :event_id
      add_index :events_users, :user_id 
      add_index :events_users, [:event_id, :user_id]
    end

    def self.down
      drop_table :events_users
    end
end

以下是我的模特:

class User < ActiveRecord::Base
    has_and_belongs_to_many :events
end

class Event < ActiveRecord::Base
    has_and_belongs_to_many :users
end

这是我的活动表格:

    <li>
    <%= link_to event.title, event %>
  | <%= link_to "delete", event, method: :delete %>

  | *insert sign up here*

   </li>

基本上我的问题是,我如何制作一个表格和控制器,让登录用户,注册数据库中的一个事件?我已经坚持了几天。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

如果您还没有发现它,那么如果您从Ryan Bates结帐轨道广播,那么您将获得真正的待遇。这是一个关于在具有HABTM关联的表单中使用复选框的教程 - 实际上他建议,你应该考虑它,通过关系而不是HABTM转向has_many。

无论如何,它至少应该让您了解如何使其在您的应用中运行。 http://railscasts.com/episodes/17-habtm-checkboxes-revised。那一集可能需要一个会员资格,然而,每月9美元的bux对于你获得的内容是完全合理的。

答案 1 :(得分:0)

我建议使用has_many而不是使用has_and_belongs_to来解决可伸缩性问题,这是一种建议的做法。根据您的要求,我做了类似的事情,但用户跟随其他用户并尝试采用其中一些用于您的要求。

class Event < ActiveRecord::Base
  has_many : Relationship
  has_many : users, :through => :Relationships
end

class User < ActiveRecord::Base
  has_many :Relationship
  has_many :events, :through => :Relationships

  //define other methods//
  def follow!(event_id)
    relationships.create!(event_id: event.id)
  end
end

class Relationship < ActiveRecord::Base
  attr_accessible :event_id      
  belongs_to :events
  belongs_to :users
end

您需要像这样创建关系迁移

class CreateRelationships < ActiveRecord::Migration
def change
    create_table :relationships do |t|
      t.integer :user_id
      t.integer :event_id
      t.timestamps
    end
    add_index :relationships, :user_id
    add_index :relationships, :event_id
    add_index :relationships, [:user_id, :event_id], unique: true
  end
end

您可以尝试在事件页面视图上添加一个按钮。

<%= form_for(current_user.relationships.build(evnt_id: @user.id)) do |f| %>
    <div><%= f.hidden_field :event_id %></div>
    <%= f.submit "Follow", class: "btn btn-large btn-primary" %>
   <% end %>

关系控制器可以是这样的。

class RelationshipsController < ApplicationController
    def create
     @user = User.find(params[:relationship][:event_id])
     current_user.follow!(@user)
     respond_to do |format|
      format.html { redirect_to @user }
     end
    end
  end

本教程对我开发用户跟随其他用户的应用程序非常有帮助。希望它也会对你有所帮助。祝好运 !! http://ruby.railstutorial.org/chapters/following-users#top