2012-03-13 8 views
1

それらの間の多型の関連付け(S):2 STI階層及びIは、以下た

  • リセラー階層、STI、再販業者DBテーブルのツリー構造。 BaseResellerは親である、と私はなど、エージェント、再販業者、IPSP、
  • ユーザーSTIのようないくつかの具体的なサブタイプを持っている - ベース等、ロジックがある
  • ユーザーモデルであり、ResellerUserのようないくつかの具体的なサブタイプを持っていますどの代理店にも代理店を管理する管理者がいることになります。エージェント管理者を持つエージェント、IPSP管理者を持つIPSPなどがあります。管理ユーザーは再販業者の作成時に検証され、管理ユーザーなしで再販業者を作成することはできません。
  • ResellerUserを再販業者に割り当てようとしています。 ResellerUserインスタンスはあらかじめ作成されており、具体的な販売代理店の作成時にResellerUserドロップダウンから選択します。
  • コントローラメソッドを作成し実行した後、我々はDBで:

リセラーテーブル

admin_id = 7 (correct) 
type = Reseller (also correct) 

ユーザテーブル

owner_id = 6 (correct) 
owner_type = BaseReseller (is this OK?) 
type = ResellerUser (correct) 

問題は、多型の関連付けであると思われます、私は@ reseller.adminを呼び出す場合、すべてがDBで大丈夫ですが、私はnilを取得します。これは、それらの間に多相関連を持つ2つのSTI階層があるためですか?これはRailsでサポートされていますか?そうでない場合は、誰かがこれを解決する方法を知っていますか?前もって感謝します。ここ

コード:

class BaseReseller < ActiveRecord::Base 

    set_table_name "resellers" 

    acts_as_nested_set 

    belongs_to :admin, :polymorphic => true 
    has_many :users, :as => :owner 
end 

class IPSP < BaseReseller 
end  

class Agent < BaseReseller 
end 

class Reseller < BaseReseller 
end 

class User < ActiveRecord::Base 
    belongs_to :owner, :polymorphic => true 
    has_one :administrable_owner, :as => :admin 
end 

class ResellerUser < User 
end 

class ResellersController < ApplicationController 
    ... 
    def create 
    @reseller = Reseller.new(params[:reseller]) 
    admin_user = ResellerUser.find(params[:reseller][:admin_id]) 
    @reseller.admin = admin_user 
    @reseller.users << admin_user unless @reseller.users.include?(admin_user) 
    if @reseller.save 
     redirect_to @reseller 
    else 
     render :action => :new 
    end 
    end 
end 

DBスキーマ:

CREATE TABLE users (
    id int(11) NOT NULL AUTO_INCREMENT, 
    owner_id int(11) DEFAULT NULL, 
    owner_type varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, 
    type varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, 
    PRIMARY KEY (id), 
    KEY index_users_on_owner_id (owner_id), 
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

CREATE TABLE resellers (
    id int(11) NOT NULL AUTO_INCREMENT, 
    admin_id int(11) DEFAULT NULL, 
    type varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, 
    parent_id int(11) DEFAULT NULL, 
    rgt int(11) DEFAULT NULL, 
    lft int(11) DEFAULT NULL, 
    depth int(11) DEFAULT NULL, 
    PRIMARY KEY (id), 
    KEY index_resellers_on_admin_id (admin_id), 
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

答えて

1

あなたは二重の多型が問題を引き起こしていると思うなら、私は一時的に階層の1(及び、その後の多型を取り除く示唆その他)、まだ問題があるかどうかを確認してください。それは問題の範囲を狭めるでしょう。

また、スキーマ定義はどのように見えますか?外部キー列が不足している可能性があります。

+0

私はDBスキーマで投稿を更新しました。私は何も見逃していないと思うが、とにかく見ることができる。 –

+0

修正済み!リセラー表の中に欠けているadmin_typeがありました。 –

+0

@EmilPetkovあなたが答えを見つけた場合は、あまりにもアップしてください。ありがとう! – Kelvin