[英]Rails 4 : Amistad gem breaks polymorphic association
我有一個使用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
,因此我需要能夠檢索我所屬的所有具有用戶的Groups
。 所以在我的用戶模型中,我做了:
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生成以下查詢(錯誤1):
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'
。 我試圖查看寶石內部,但沒有發現為什么存在任何沖突。
有想法嗎?
編輯
我分叉了寶石,並試圖四處亂竄。 看來寶石正在使用squeel
,這正是此問題的根源。
編輯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
好吧,我現在問了一個問題,但事實證明上述方法不起作用。 我實際上需要從Amistad gem上的friend_model/friends
刪除Squeel
。
修補它的分支版本可以在https://github.com/softmonkeyjapan/amistad中找到
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.