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