0

Amistad gemを使用しているユーザー モデルがあります。これまでのところ、すべてが正常に機能していました。私のアプリには、 と のmembers2 つのフィールドしかないテーブルも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
4

1 に答える 1

0

さて、私はしばらくこの質問をしましたが、上記がうまくいかないことが判明しました。実際にはAmistad gemSqueelから削除する必要がありました。 パッチを適用するフォークされたバージョンは、https://github.com/softmonkeyjapan/amistadにあります。friend_model/friends

于 2014-11-26T11:35:33.617 に答える