私はかなり新しい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