ruby-on-rails 具有自引用关联的Rails引用模型

ghg1uchk  于 2022-12-20  发布在  Ruby
关注(0)|答案(1)|浏览(168)

我试图在Rails应用程序上创建一个推荐程序,我在处理关系时遇到了困难。
我的推荐模式非常简单:godfather_idgodson_idstate教父和教子ID都引用一个用户,该用户可以有多个教子,但只能有一个教父。

class Referral < ApplicationRecord
  belongs_to :user
  belongs_to :godson, class_name: 'User'
end

这个问题出现在我的用户模型中。我不希望能够执行user.godsons来获得 * godsons * 用户的数组,也不希望能够执行user.godfather来获得 * godfather * 用户。
我尝试了一些事情,我认为这两个地方最接近我需要做的事情(用户模型简化为示例)。
x一个一个一个一个x一个一个二个x
我真的不知道如何实现这一关系,任何帮助将不胜感激🙏

polhcujo

polhcujo1#

要进行实际的自引用关联,只需在users表中添加一列,该列指向同一个表:

class AddGodfatherToUsers < ActiveRecord::Migration[6.1]                                                                                                                                       
  def change                                                                                                                                                                                      
    add_reference :users, :godfather, null: true, 
                                      foreign_key: { to_table: :users }                                                                                                                           
  end                                                                                                                                                                                        end
class User
  belongs_to :god_father,
    class_name: 'User',
    optional: true,
    inverse_of: :god_children
  has_many :god_children,
    class_name: 'User',
    foreign_key: :god_father_id
    inverse_of: :god_father
end

如果你必须将Referalls存储为一个单独的表,你的思路是对的,但是你把外键弄反了:

class Referral < ApplicationRecord
  # you better be explicit here or its going to get extremely confusing
  belongs_to :godfather, class_name: 'User' 
  belongs_to :godson, class_name: 'User'
end

class User < ApplicationRecord
  has_many :referrals_as_godfather, 
    class_name: 'Referral', foreign_key: 'godfather_id'
  has_one :referral_as_godson, 
    class_name: 'Referral', 
    foreign_key: 'godfather_id'
  has_many :godsons, through: :referrals_as_godfather
  has_one :godfather, through: :referral_as_godson
end

需要注意的是,has_one并不保证一个用户只能有一个推荐(因此只有一个教父),它只是给查询添加了一个LIMIT 1,您必须通过唯一性约束和验证来强制执行。

相关问题