0

スーパーヒーロー、パワー、チームの 3 つのテーブルがあります。

スーパーヒーローは多くの力と多くのチームを持つことができます。

例えば:

superhero.rb
  name:string

  has_many :power_teams, :dependent => :destroy
  has_many :powers, :through => :power_teams, :foreign_key => :power_id 
  has_many :teams, :through => :power_teams, :foreign_key => :team_id

power.rb
  name:string
  has_many :power_teams, :dependent => :destroy

team.rb
  name:string
  has_many :power_teams, :dependent => :destroy

#This is what I want to add to
power_team
  belongs_to :superhero
  belongs_to :power
  belongs_to :team

更新ここにスーパーヒーローのコントローラーがあります

def create
  @hero = Superhero.new(params[:hero])

形:

<%= form_for(@hero) do |f| %>

  <%= f.label :name %><br />
  <%= f.text_field :name %>

  #Teams are a drop-down, you can only choose 1 team
  <%= f.collection_select(:team_ids, Team.all(:order=>:name), :id, :name, {:prompt => true}) %>

  #powers are checkboxes, you can choose multiple powers
  <% Power.all.each do |power| %>
     <label class="checkbox">
     <%= check_box_tag "superhero[power_ids][]", power.id, @hero.power_ids.include?(power.id) %>
     <%= power.name %>
     </label>
  <% end %>
<% end %>

保存すると、1 つのチームと 2 つのパワーが得られます (インデックス ページで):

Hero | Power | Team
  1      1     
  1      2
  1              1

これは正しいですか?私はこれを見て期待していると思いました:

Hero | Power | Team
  1      1       1
  1      2       1
4

1 に答える 1

0

パワーとチーム間の関係を作成したいとおっしゃいましたが、現在、power_team にはパワーに対して宣言された関連付けしかありません。power_teams テーブルに team_id がある場合、おそらく power_team モデルにもこれがあるはずです。

belongs_to :team

問題はそれだけではないかもしれません。モデルを部分的にしか定義していない、スキーマを定義していない、更新に使用していたフォームなどのコードを提供していないため、見分けるのは困難です。

各モデルで両方の方法で関連付けが設定されていること、および関連付けの定義が一致していることを確認してください。モデルのテーブルに外部キー列がある場合は belongs_to を使用し、このモデルに外部キー列が定義されている関連付けられたモデルのテーブルである場合は has_one/has_many (返されると予想されるレコード数に応じて) を使用します。 has_and_belongs_to_many (別名「HABTM」)のみの結合テーブルがある場合結合する 2 つのテーブルの各外部キーに 1 つずつ、合計 2 つの列があります。すでにいくつかの従属破棄を行っているように見えるので、それについて言及する必要はありません。レガシー スキーマと統合している場合、関連付けのいずれかの側で非標準のテーブル名を使用していた場合、非標準の結合テーブル名、非標準の外部キー列名および/または ID、または非標準のモデルを使用していた場合クラス名の場合、関連の両側で関連の他のオプションを正しく設定する必要があります。

一括割り当てセキュリティは問題ではないことをコメントで指摘しましたが、関連するオブジェクトを更新する予定がある場合は (最新の 3.2.x のデフォルトである一括割り当てセキュリティとホワイトリストを備えた Rails 3.1+ を使用していると仮定して) ) で_attributes定義された属性名の末尾に追加することでattr_accessible、ネストされた属性を受け入れるものを指定します。Rails 4 では、一括代入セキュリティが廃止されるため、strong_parameters の使用に関心がある場合は、これと他の新しい Rails 4 テクノロジ (rails-api、ActiveModel::Serializers など) を調べる良い機会になるでしょう。現在 Rails 3 で使用できます。

アップデート:

質問が更新されて以来、スーパーヒーローが power_teams に関連付けられていることがわかりました。その関連付けは、スーパーヒーローでも power_team でも必要ないので、削除します。作成フォームがロードされたときに「新しい」アクションメソッドにルーティングされ、フォーム送信を受け入れるための「作成」アクションメソッドにルーティングされる必要があるため、問題のコントローラーからまだコードが欠落しているようです。 「new」および「create」と呼ばれる少なくとも 2 つのメソッドである必要があります。新しいプロジェクトを開始し、Rails generate scaffold メソッドを使用して最初のものを取得するのは良い考えかもしれません。これで、スキーマがまっすぐになりました (ここで言及した変更により、スーパーヒーローと power_team の関連付けが削除され、その逆も同様です)。 . 他の質問に基づいて、あなたがRailsに慣れていないことは知っていますが、http://guides.rubyonrails.org/getting_started.html

于 2013-02-01T16:43:42.940 に答える