0

そのため、私たちに役立つ情報を長く懸命に探した結果、協力できる答えを見つけるのが難しいことがわかりました.

問題は、Schools and Organizations という HABTM リレーションシップを介して結合された 2 つのテーブルがあることです。最初に学校が作成され、次に Organization が学校のリストを取得し、ユーザーが 1 つを選択できるようにしてから、3 番目のテーブル OrganizationsSchools に school_id と organization_id の両方を入力します。

3 つのモデルは次のとおりです。 学校モデル:

class School < ActiveRecord::Base
  has_and_belongs_to_many :organizations, :join_table => 'organizations_schools'
  attr_accessible :name
  validates :name, :presence => true
end

組織モデル:

class Organization < ActiveRecord::Base
  has_many :materials
  has_many :users
  has_and_belongs_to_many :causes
  has_and_belongs_to_many :schools, :join_table => 'organizations_schools'
  attr_accessible :name, :unlogged_books_num, :id

  validates :name, :presence => true
end

組織のフォーム:

<%= form_for(@organization) do |f| %>
  <% if @organization.errors.any? %>
     <div id="error_explanation">
      <h2><%= pluralize(@organization.errors.count, "error") %> prohibited this organization from being saved:</h2>

      <ul>
      <% @organization.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>


<% @schools = School.all %>
  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </div>
  <div class="field">
    <%= f.label :unlogged_books_num %><br />
    <%= f.number_field :unlogged_books_num %>
  </div>
  <div class="field">
    <%= f.label 'School' %><br />
    <% school_id = nil %>
    <%= collection_select(nil, school_id, @schools, :id, :name) %>  
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

最後に、Organizations コントローラーの create 関数

class OrganizationsController < ApplicationController
  .
  .
  .
  def create
    @organization = Organization.new(params[:organization])
    org_id = @organization.id
    school_id = @organization.school_id
    @org_school = OrganizationsSchool.create(:organization_id => org_id, :school_id => school_id)

    respond_to do |format|
      if @organization.save
        format.html { redirect_to @organization, notice: 'Organization was successfully created.' }
        format.json { render json: @organization, status: :created, location: @organization }
      else
        format.html { render action: "new" }
        format.json { render json: @organization.errors, status: :unprocessable_entity }
      end
    end
  end
end

コントローラーの他のすべての関数は、安らかに作成されます。また、私はデータベースに精通しているわけではありません。また、Rails についてはよく知っていますが、それを使いこなすことはまったく得意ではありません。

4

1 に答える 1

4

has_and_belongs_to_many では、Organization の school_id フィールドはありません。あなたが実際に望んでいるように聞こえます:

class Organization < ActiveRecord::Base
  belongs_to :school
  ...
end

class School < ActiveRecord::Base
  has_many :organizations
end

本当に HABTM が必要な場合は、次のように記述できます。

@organization.schools << School.find school_id

編集has_many:関係に切り替えた場合、コントローラーコードに追加の変更が必要になることは明らかです

于 2013-06-11T21:35:43.147 に答える