Amistad gemを使用しているユーザー モデルがあります。これまでのところ、すべてが正常に機能していました。私のアプリには、 と のmembers
2 つのフィールドしかないテーブルもuser_id
ありgroup_id
ます。
このmembers
テーブルを使用してコミュニティ メンバーも格納する必要があるため、これをポリモーフィック テーブルにすることにしました。
class CreateMembers < ActiveRecord::Migration
def change
create_table :members do |t|
t.integer :user_id
t.string :memberable_type
t.integer :memberable_id
end
end
end
続行するには、memberable
自分のグループとコミュニティに関連付ける懸念事項を作成しました:
# app/models/concerns/memberable.rb
module Memberable
extend ActiveSupport::Concern
included do
has_many :members_users, as: :memberable, class_name: Member
has_many :members, through: :members_users, source: :user
end
end
# app/models/group.rb
class Group < ActiveRecord::Base
include Memberable
belongs_to :user
end
# app/models/community.rb
class Community < ActiveRecord::Base
include Memberable
belongs_to :user
end
これまでのところ、すべての協会がうまく機能しています。ただし、私のmembers
テーブルにはGroups
とが含まれCommunities
ているため、所属しているすべてのグループを取得できる必要があります。したがって、私のユーザーモデルでは、次のことを行いました。
class User < ActiveRecord::Base
has_many :members
has_many :groups, through: :members, source: :memberable, source_type: 'Group'
has_many :created_groups, class_name: Group
end
このコード自体は正常に動作し、呼び出すuser.groups
と次のクエリが生成されます。
SELECT `groups`.*
FROM `groups`
INNER JOIN `members` ON `groups`.`id` = `members`.`memberable_id`
WHERE `members`.`user_id` = 1
AND `members`.`memberable_type` = 'Group'
しかし、最初にタイトルと上記で述べたように、私はAmistad gemを使用しているので、それを含めました:
class User < ActiveRecord::Base
include Amistad::FriendModel
has_many :members
has_many :groups, through: :members, source: :memberable, source_type: 'Group'
has_many :created_groups, class_name: Group
end
これは、どういうわけか私のポリモーフィックな関連付けを壊しますが、その理由はわかりません。を呼び出すとuser.groups
、Rails は次のクエリ (BAD ONE) を生成します。
SELECT `groups`.*
FROM `groups`
INNER JOIN `members` ON `groups`.`id` = `members`.`memberable_id`
WHERE `members`.`user_id` = 1
AND `groups`.`memberable_type` = 'Group'
最後の行に注意してください: AND groups.memberable_type = 'Group'
. 競合が発生した理由を見つけることなく、宝石の内部を調べようとしました。
アイデアはありますか?
編集
私は宝石をフォークし、ハックしようとしました。gem が使用しているように見えるのは、squeel
まさにこの問題の原因です。
EDIT 2
ええええええ、私は修正を見つけました。Member
私のモデル内では、以前は次のものがありました。
class Member < ActiveRecord::Base
belongs_to :user
belongs_to :memberable, polymorphic: true
end
との競合を修正するために、次のようSqueel
に変更する必要がありました。
class Member < ActiveRecord::Base
belongs_to :user
belongs_to :memberable, polymorphic: true, foreign_type: 'members.memberable_type'
end