簡體   English   中英

Rails 4:Amistad寶石打破了多態性關聯

[英]Rails 4 : Amistad gem breaks polymorphic association

我有一個使用Amistad gem的用戶模型。 到目前為止,一切工作正常。 在我的應用程序中,我還有一個members表,該表只有2個字段: user_idgroup_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM