0

私はかなり新しいRails開発者であり、既存のモデル(Champion)に関連付けられている(Ability)に新しいモデルを追加しようとしている既存のアプリケーションがあります。「has_one」と「belongs_to」のメカニズムを論理的に理解する方法に合わせて設定しましたが、各チャンピオンのhas_one関係ごとに同じ1つのレコードしか返されません。

設定は次のとおりです。

既存のモデルはチャンピオンと呼ばれ、チャンピオンモデルの一部である新しいアビリティモデルを作成しています。チャンピオンモデルを、「q」、「w」、「e」、「r」、「パッシブ」の5つの能力を持つように編成したいと思います。各能力は、1人のチャンピオンにのみ属します。

champion_idこれが、belongs_toアソシエーション用の新しいAbilityオブジェクトを追加する移行です。

class CreateAbilities < ActiveRecord::Migration
  def change
    create_table :abilities do |t|
      t.integer :champion_id
      t.timestamps
    end
  end
end

チャンピオンモデルに能力参照を追加する移行は次のとおりです。

class AddAbilitiesToChampions < ActiveRecord::Migration
  def change
    add_column :champions, :q, :integer
    add_column :champions, :w, :integer
    add_column :champions, :e, :integer
    add_column :champions, :r, :integer
    add_column :champions, :passive, :integer
  end
end

Ability.rbモデル:

class Ability < ActiveRecord::Base
  attr_accessible :ability_description,
                  :cost,
                  :effect,
                  :cooldown,
                  :range,
                  :name,
                  :icon,
                  :champion_id

  belongs_to :champion
end

Champion.rbモデル:

class Champion < ActiveRecord::Base
  attr_accessible :champion_id,
                  :q,
                  :w,
                  :e,
                  :r,
                  :passive

  has_one :q, :class_name => "Ability"
  has_one :w, :class_name => "Ability"
  has_one :e, :class_name => "Ability"
  has_one :r, :class_name => "Ability"
  has_one :passive, :class_name => "Ability"
end

この時点で、関係を正しく作成しているように見えるモデルができましたが、サーバーで出力を表示すると、すべての能力の関連付けに対して同じselectステートメントを実行し、毎回同じレコードを選択します。

Started GET "/champions.json" for 127.0.0.1 at 2013-01-08 15:13:30 -0700
Processing by ChampionsController#index as JSON
  Champion Load (0.5ms)  SELECT "champions".* FROM "champions" 
  Item Load (0.4ms)  SELECT "items".* FROM "items" 
  Spell Load (0.3ms)  SELECT "spells".* FROM "spells" 
  Mastery Load (0.3ms)  SELECT "masteries".* FROM "masteries" 
  CACHE (0.0ms)  SELECT "champions".* FROM "champions" 
  Ability Load (0.6ms)  SELECT "abilities".* FROM "abilities" WHERE "abilities"."champion_id" = 1 LIMIT 1
  CACHE (0.0ms)  SELECT "abilities".* FROM "abilities" WHERE "abilities"."champion_id" = 1 LIMIT 1
  CACHE (0.0ms)  SELECT "abilities".* FROM "abilities" WHERE "abilities"."champion_id" = 1 LIMIT 1
  CACHE (0.0ms)  SELECT "abilities".* FROM "abilities" WHERE "abilities"."champion_id" = 1 LIMIT 1
  CACHE (0.0ms)  SELECT "abilities".* FROM "abilities" WHERE "abilities"."champion_id" = 1 LIMIT 1
  Ability Load (0.2ms)  SELECT "abilities".* FROM "abilities" WHERE "abilities"."champion_id" = 2 LIMIT 1
  CACHE (0.0ms)  SELECT "abilities".* FROM "abilities" WHERE "abilities"."champion_id" = 2 LIMIT 1
  CACHE (0.0ms)  SELECT "abilities".* FROM "abilities" WHERE "abilities"."champion_id" = 2 LIMIT 1
  CACHE (0.0ms)  SELECT "abilities".* FROM "abilities" WHERE "abilities"."champion_id" = 2 LIMIT 1
  CACHE (0.0ms)  SELECT "abilities".* FROM "abilities" WHERE "abilities"."champion_id" = 2 LIMIT 1
Completed 200 OK in 111ms (Views: 47.4ms | ActiveRecord: 12.8ms)

selectステートメントがこれらの各属性に対して正しい機能を選択するようにセットアップを変更するにはどうすればよいですか?私はあまり成功せずに関係を逆転させようとしました。どんな助けでも大歓迎です!

編集:モデルのJSONを提供するchampions_controller.rbのコードは次のとおりです。

class ChampionsController < ApplicationController
  before_filter :find_champions

  def find_champions
    @champions = Champion.all
  end

  def index
    respond_to do |format|
      format.json { render :json => { "champions" => @champions }}
    end
  end
end
4

2 に答える 2

1

チャンピオンモデルでこれを試してみてください。所属を使用すると、foreign_keyは関係を定義するモデルになり、has_oneは関連付けられたモデルを調べます。

belongs_to :q, :class_name => "Ability", :foreign_key => "q" 
belongs_to :w, :class_name => "Ability", :foreign_key => "w"
belongs_to :e, :class_name => "Ability", :foreign_key => "e" 
belongs_to :r, :class_name => "Ability", :foreign_key => "r" 

詳細情報

于 2013-01-08T22:54:06.427 に答える
0

チャンピオンモデルにforeign_keyオプションを追加する必要があります。

has_one :q, :class_name => "Ability", :foreign_key => "q" 
has_one :w, :class_name => "Ability", :foreign_key => "w"
has_one :e, :class_name => "Ability", :foreign_key => "e" 
has_one :r, :class_name => "Ability", :foreign_key => "r" 
于 2013-01-08T22:31:42.660 に答える