Ruby on rails 您将如何使用自引用和类别对联系人列表进行建模?

Ruby on rails 您将如何使用自引用和类别对联系人列表进行建模?,ruby-on-rails,model,self-reference,Ruby On Rails,Model,Self Reference,向模特儿追捧 用户有许多联系人类别(家人/朋友) 一个联系人类别有多个联系人 一个联系人可以属于一个或多个联系人类别 最后,我做了以下几点,但我仍然相信,一定有更好的解决办法 class User < ActiveRecord::Base has_many :contact_groups def get_all_contacts self.contact_groups.each do |group| contacts <

向模特儿追捧

  • 用户有许多联系人类别(家人/朋友)
  • 一个联系人类别有多个联系人
  • 一个联系人可以属于一个或多个联系人类别
  • 最后,我做了以下几点,但我仍然相信,一定有更好的解决办法

    class User < ActiveRecord::Base  
        has_many :contact_groups  
    
        def get_all_contacts  
            self.contact_groups.each do |group|  
            contacts << group.users  
        end  
    end  
    
    class ContactGroup < ActiveRecord::Base  
        has_and_belongs_to_many :users  
    end 
    
    class用户联系人您可以通过关联使用has\u many:

    class User
        has_many :contacts
        has_many :contact_groups, :through => :contacts
    end
    
    class Contact
        belongs_to :user
        has_many :contact_groups
    end
    
    class ContactGroup
        belongs_to :contacts
    end
    
    这将起作用。

    假设
    • 这是一个多用户系统,而不仅仅是一个用户,因此您需要使用外键在联系人和组记录上指定所有者
    • 一个联系人可以属于多个组,并且一个组有多个联系人,因此这是一个has_和_属于_-to_-many关系
    迁移 创建用户表:

    class CreateUsers < ActiveRecords::Migrations
      def change
        create_table :users do |t|
          t.text :username
        end
      end
    end
    
    接触模型。联系人属于所有者,我们使用“用户”模型处理所有者关系。此外,联系人指的是另一个用户(或属于Rails,在这种情况下有点混乱),但是:User与模型的名称匹配,所以我们不需要像为:owner那样指定联系人。最后,团队拥有并属于许多与团队的关系

    class Contact
      belongs_to :owner, :class_name => 'User'
      belongs_to :user
      has_and_belongs_to_many :groups
    end
    
    集团模式。一个组属于一个所有者,拥有并属于多个联系人

    class Group
      belongs_to :owner, :class_name => 'User'
      has_and_belongs_to_many :contacts
    end
    
    我们不需要为contacts_groups表创建一个模型,因为我们不会直接访问它,而是只通过Contact或Group访问它

    结果 这将允许您执行以下操作:

    @user.contacts # all of the user's contacts
    @user.groups # all of the user's groups
    @user.groups.find(id).contacts # all the contacts in a group
    @user.contacts.find(id).groups # all of the groups that a contact belongs to
    
    向组中添加联系人 这是对@benrmatthews的评论的回应,该评论询问在群中添加联系人时视图的外观。

    实际上有很多不同的方法来实现这一点,但总体思路是,您需要将联系人id和组id传递给控制器操作,然后控制器操作将在Contact_groups表中创建一个条目,以指示联系人已添加到组中

    您的路线可能如下所示:

    resources :contact_groups, only: [:create]
    
    class ContactGroupsController < ApplicationController
      def create
        @contact = Contact.find(params[:contact_id])
        @group = Group.find(params[:group_id])
        @contact.groups << @group
      end
    end
    
    然后,您将拥有一个类似以下内容的控制器:

    resources :contact_groups, only: [:create]
    
    class ContactGroupsController < ApplicationController
      def create
        @contact = Contact.find(params[:contact_id])
        @group = Group.find(params[:group_id])
        @contact.groups << @group
      end
    end
    

    这将创建一个表单,其中包含
    联系人id
    的隐藏字段和显示组名列表的选择字段。提交此表单时,它会将
    联系人id
    组id
    传递给控制器操作,然后控制器操作将有足够的信息来完成此操作。

    感谢您的及时回复。但我想保留模型联系人作为用户模型的参考,因为这是一种社交网络,用户将只从用户模型中获得联系人,而不会从其他人那里获得联系人。将“属于:用户”添加到“联系人”类将解决我的问题?我正在用新的结构更新上述答案,因为我认为这将更适合您的情况。太棒了!比啤酒更好(在某些情况下:-)非常感谢!这在视图中会是什么样子?我不知道你在问什么@benrmatthews。你能告诉我你想在视图中实现什么吗?@toasterlovin如果我想在联系人显示页面上添加联系人,我将如何在联系人显示页面上执行此操作?@benrmatthews我添加了用于将联系人添加到组的路由/控制器/视图逻辑。享受吧!
    resources :contact_groups, only: [:create]
    
    class ContactGroupsController < ApplicationController
      def create
        @contact = Contact.find(params[:contact_id])
        @group = Group.find(params[:group_id])
        @contact.groups << @group
      end
    end
    
    # This is for adding the contact to a group
    form_tag contact_groups_path do
      hidden_field_tag :contact_id, @contact.id
      select_tag :group_id, options_from_collection_for_select(Group.all, :id, :name)
      submit_tag "Add to Group"
    end