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;
私はDBスキーマで投稿を更新しました。私は何も見逃していないと思うが、とにかく見ることができる。 –
修正済み!リセラー表の中に欠けているadmin_typeがありました。 –
@EmilPetkovあなたが答えを見つけた場合は、あまりにもアップしてください。ありがとう! – Kelvin