две иерархии ИППП и полиморфная (ые) ассоциация (и) между ними - PullRequest
1 голос
/ 13 марта 2012

У меня есть следующее:

  • Иерархия посредников, 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;

1 Ответ

1 голос
/ 13 марта 2012

Если вы считаете, что двойной полиморфизм вызывает проблему, я предлагаю временно удалить полиморфизм из одной из иерархий (а затем и другой), чтобы проверить, сохраняется ли проблема.Это сузит масштаб проблемы.

Кроме того, как выглядит ваша схема?Возможно, вам не хватает столбца внешнего ключа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...