如何在rails上使用ruby连接两个表

时间:2014-02-25 06:43:18

标签: ruby-on-rails

我有两个表格,positions表格包含字段idposition_idfirst_namelast_name。另一个表格为positionslist,其中包含字段idpositions。我如何才能加入这两个表? 这是我的位置控制器:

class PositionsController < ApplicationController
  def index
    #@positions = Position.all(:order=>'updated_at DESC')
    @positions = Position.joins(:positions => :positionlists)
  end
  def new
    @position = Position.new
  end

  def create
    @position = Position.new(params.require(:position).permit(:position_id, :first_name, :last_name))
    if @position.save
      redirect_to(:controller=>'positions')
    else
      render 'new'
    end
  end

  def edit
    @position = Position.find(params[:id])
  end

  def update
    @position = Position.find(params[:id])
    if @position.update(params.require(:position).permit(:position_id, :first_name, :last_name))
      redirect_to(:controller=>'positions')
    else
      render 'edit'
    end
  end

  def destroy
    @position = Position.find(params[:id])
    @position.destroy
    redirect_to(:controller=>'positions')
  end
end

我的模特位置.rb

class Position < ActiveRecord::Base
  has_many :positionlists
  has_many :positionlists , :through => :positions
  validates :first_name, length: { in: 4..20}
  validates :last_name, length: { in: 4..20}
end

我的模特位置列表.rb

class Positionlists < ActiveRecord::Base
  has_many :positions
end

任何我的位置index.html.erb

<% content_for :title, "Positions" %>
  <%= render "layouts/nav" %>
  <div class="clear"></div>
  <h1>Positions List</h1>
  <%= link_to "Add", new_position_path, :class =>'btn btn-success' %>
  <br />
  <br />
  <table class="table">
    <tr>
      <th>First Name</th>
      <th>Last Name</th>
      <th>Position</th>
      <th>Options</th>
    </tr>
    <% @positions.each do |positions| %>

    <tr>
      <td><%= positions.first_name %></td>
      <td><%= positions.last_name %></td>
      <td><%= positions.position_id %></td>
      <td>
        <%= link_to "Edit", edit_position_path(positions)%> |
        <%= link_to "Delete", position_path(positions),
                              method: :delete, data:{confirm: 'Are you sure you want to delete this?.' }%>
      </td>
    </tr>
    <% end %>
  </table>

非常感谢任何帮助!感谢

1 个答案:

答案 0 :(得分:0)

Rails会为您解决此问题。

class PositionList < ActiveRecord::Base
  has_many :positions
end

class Position < ActiveRecrod::Base
  belongs_to :position_list
end

为简单起见,您的position也需要position_list_id列。如果我理解你在这里想做什么。

其他问题:命名您的班级PositionLists而不是PositionList会混淆Rails自动命名约定。

你的表中也有一组奇怪的列。对于你想要的东西,我可以告诉你的位置表需要有列:

first_name
last_name
id (automatic)

您的position_list表中似乎没有任何内容,因此在自动ID列之外没有您需要的列。该关联是Position类中的belongs_to和位置表中的position_list_id列自动生成的。

如果你想知道这一切有多么简单,可以尝试运行自动脚手架,看看它是如何完成的,并从中学习。也许生成一个新的Rails应用程序,然后运行这样的东西:

rails g scaffold position_list name
rails g scaffold position first_name last_name position_list:references

这将使您position_list.positions获取任何position_list或Position.all的所有头寸,以获取所有头寸的列表。

听起来很多Rails对你来说都是新手。 Hartl的经典之作是一个很棒的介绍:http://ruby.railstutorial.org/ruby-on-rails-tutorial-book