STIを使用するときに、レール3とのhas_many関連付けからコレクションをフェッチするときに、いくつかの異常な動作が発生します。私が持っている:Rails STIとサブクラスの関連付け
class Branch < ActiveRecord::Base
has_many :employees, class_name: 'User::Employee'
has_many :admins, class_name: 'User::BranchAdmin'
end
class User < ActiveRecord::Base
end
class User::Employee < User
belongs_to :branch
end
class User::BranchAdmin < User::Employee
end
望ましい行動がbranch.employees
が分岐管理者を含むすべての従業員を返すことです。支店の管理者にのみ、このコンソールから出力され、彼らはbranch.admins
がアクセスしたときに、このコレクションの下に「ロードされた」ように見える:
Branch.first.employees.count
=> 2
Branch.first.admins.count
=> 1
Branch.first.employees.count
=> 3
これは、生成されたSQLで初めて見ることができます。
SELECT COUNT(*) FROM "users" WHERE "users"."type" IN ('User::Employee') AND "users"."branch_id" = 1
目と2回目:
SELECT COUNT(*) FROM "users" WHERE "users"."type" IN ('User::Employee', 'User::BranchAdmin') AND "users"."branch_id" = 1
私はちょうど指定することによってこの問題を解決することができます:
class Branch < ActiveRecord::Base
has_many :employees, class_name: 'User'
has_many :admins, class_name: 'User::BranchAdmin'
end
彼らはすべて彼らのBRANCH_IDから見つけることが、私はその後、クラスがUser
がデフォルトになりますbranch.employees.build
をしたいと私はどこかのタイプの列でハックする必要がある場合、これは、コントローラで問題を作成するので。私は今のところこれを持っています:
has_many :employees, class_name: 'User::Employee',
finder_sql: Proc.new{
%Q(SELECT users.* FROM users WHERE users.type IN ('User::Employee','User::BranchAdmin') AND users.branch_id = #{id})
},
counter_sql: Proc.new{
%Q(SELECT COUNT(*) FROM "users" WHERE "users"."type" IN ('User::Employee', 'User::BranchAdmin') AND "users"."branch_id" = #{id})
}
しかし、私は本当にこれを避けたいと考えています。誰でも、どんなアイデアですか?
EDIT:親の会がこれを使用していないので、organisation.employees
has_many :employees, through: :branches
ことを再度選択のみでUser::Employee
クラスが含まれると思われるので、
finder_sqlとcounter_sqlは本当に私のためにそれを解決していません。
これは素晴らしいキャッチです、ありがとう。とにかくモデルの構造は実際に変更されたので問題は消えましたが、私はそれが環境の影響であるとも考えていないと思います! –