У меня есть следующее:
- Иерархия посредников, STI, древовидная структура в таблице БД посредников.BaseReseller является родителем, и у меня есть несколько конкретных подтипов, таких как Agent, Reseller, IPSP и т. Д.
- User STI - база - это модель пользователя и имеет несколько конкретных подтипов, таких как ResellerUser и т. Д.
- Логика заключается в том, что у любого посредника будет пользователь-администратор, управляющий посредником, например, агент с администратором агента, IPSP с администратором IPSP и так далее.Пользователь с правами администратора проверяется при создании посредника, не может создать посредника без имени администратора.
- Я пытаюсь назначить посредника ResellerUser.Экземпляр ResellerUser создается заранее и выбирается из раскрывающегося списка ResellerUser при создании конкретного посредника.
- После выполнения метода create controller в БД у нас есть:
таблица посредников
admin_id = 7 (correct)
type = Reseller (also correct)
таблица пользователей
owner_id = 6 (correct)
owner_type = BaseReseller (is this OK?)
type = ResellerUser (correct)
Кажется, проблема в полиморфной ассоциации, хотя в БД все в порядке, если я вызываю @ reseller.admin Iполучить ноль.Это потому, что у нас есть две иерархии ИППП с полиморфной ассоциацией между ними?Поддерживается ли это в 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
Схема БД:
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;