感谢大家批阅 :)
客户关系管理插件 has_many_customers 是根据 has_many_friends 改写而成,经过单元测试。
关系描述:Teacher.customers 一对多
Customer.teacher 一对一
代码:
将以下代码新建于项目目录 lib\customer\customer_ship.rb 下。
module Customer
##
#客户关系模块定义
module CustomerShip
##
#初始化加载
def self.included( recipient = self)
recipient.extend( ClassMethods )
end
##
#客户关系定义
module ClassMethods
##
#用法 has_many_customers
def has_many_customers(options={})
##
#顾问 - 客户 关系定义
has_many :teacherships_for_me,
:foreign_key => 'customer_id',
:class_name => 'User::EmployRecord',
:conditions=>["end_date>=? and #{User::EmployRecord.table_name}.status=?", Date.today.to_int, 0]
has_one :teachers_for_me,
:class_name=>'User::User',
:through => :teacherships_for_me,
:source => :advisor
##
# 客户 - 顾问 关系定义
has_many :customerships_by_me,
:foreign_key => 'user_id',
:class_name => 'User::EmployRecord',
:conditions=>["end_date>=? and #{User::EmployRecord.table_name}.status=?", Date.today.to_int, 0]
has_many :customers_for_me,
:class_name=>'User::User',
:through => :customerships_by_me,
:source => :customer
include Customer::CustomerShip::InstanceMethods
end
end #End ClassMethods
##
# 注册实例方法
module InstanceMethods
# 返回: 顾问滴客户
def customers
self.customers_for_me
end
# 返回: 客户滴顾问
def teacher
self.teachers_for_me
end
#帮助函数,顾问别名
alias_method :advisor, :teacher
# 返回: 客户关系列表
def customership(customer, teacher=self)
User::EmployRecord.find(:first, :conditions => ['(user_id = ? AND customer_id = ?)', teacher.id, customer.id])
end
#判断是否为客户
def is_customers_with?(customer)
#self.customers.include?(customer)
User::EmployRecord.exists?(["user_id = ? AND customer_id = ?",self.id,customer.id])
end
##
#功能说明:创建客户关系
#默认创建一年的客户顾问关系
#返回:创建的客户关系 或 空 (已经有顾问了)
def become_customers_with(customer, end_date=Time.now + 1.year, start_date=Time.now, remark="")
unless self.is_customers_with?(customer)
if customer.teacher.nil?
uc = User::EmployRecord.create!(:user_id => self.id, :customer_id => customer.id, :start_date=>start_date.to_int, :end_date=>end_date.to_int, :remark=>remark)
customer.reload()
uc
else
raise "客户已经存在顾问"
end
else
#如果存在,更新雇佣时间
uc = self.customership(customer)
uc.update_attributes(:start_date=>start_date.to_int, :end_date=>end_date.to_int, :remark=>remark)
customer.reload()
uc
end
end
##
#功能说明:返回我与该客户的关系
def delete_customers_with(customer, teacher=self)
cs = self.customership(customer, teacher)
if !cs.nil?
cs.destroy
else
raise "客户关系不存在"
end
end
end #End InstanceMethods
end # End CustomerShip Module
end #End User
上下文中的中间表为 User::EmployRecord
加入:
##
#设计关系类型 belongs_to :advisor, :foreign_key=> "user_id",:class_name=> "User::User" belongs_to :customer, :foreign_key=> "customer_id", :class_name=> "User::User"
测试和用法
uc = @user1.become_customers_with(@user2)
assert_not_equal uc, nil
assert_equal uc.customer_id.to_i, @user2.id.to_i, "uc.customer_id, @user2.id "
assert_equal uc.user_id.to_i, @user1.id.to_i, "uc.user_id, @user1.id"
assert_not_equal @user1.customers, [], "customers"
assert_not_equal @user2.advisor, nil, "advisor"
uc = @user1.become_customers_with(@user2)
assert_not_equal uc, nil
assert @user1.delete_customers_with(@user2),"delete!"
assert_equal @user1.customers, [], "customers"
感谢大家批阅 :)
分享到:
相关推荐
serialize_has_many 将has_many关系序列化为单个列,同时仍在进行属性,验证,回调,嵌套表单和fields_for。 使用ActiveRecord轻松实现NoSQL!安装将此行添加到您的应用程序的Gemfile中: gem 'serialize_has_many' ...
activemodel-associations, 用于普通 ruby 对象的has_many和belongs_to宏 ActiveModel::Associations 用于普通 ruby 对象的has_many 和 belongs_to 宏。安装将此行添加到你的应用程序的Gemfile中:gem 'activemodel-
这是关于如何使用has_many :throght创建多对多关联的完整示例has_many :throght在此示例中,我使用staff模型和client模型,其中人员有很多客户,而客户有很多员工 操作说明 在下面的终端中输入 $ rails new many - ...
HasManyCommas 允许您使用 active_record 查询以及与该查询模型上的 has_many 关联关联的符号,并提供每个父记录行及其所有子记录的表格表示,作为额外的列附加。 例如,假设您有一个用户模型: user = User....
查看一个产品搜索帖子被添加到哪个集合。 Product Hunt用户的此扩展名使他们可以查看任何产品的产品添加了集合。 这对于制造商,查看他们的产品在哪个馆藏中是有用的,而且对于所有其他可能以这种方式发现与他们当前...
入门项目 设置和运行步骤 ...cd project-name bundle install 在database.yml中,将数据库what_ever_you_named_your_start_project的名称更改为project-name rails db:create db:migrate db:seed ...
嵌套表单字段 这个Rails gem帮助创建具有嵌套has_many关联的模型的表单。 它使用jQuery动态添加和删除嵌套关联。 适用于任意深度嵌套的关联(经过4个级别的测试)。 可与诸如类的表单构建器。 需要Ruby 1.9+和Rails...
当您具有诸如has_many , has_one或belongs_to has_many的父子关系时,您可以通过一个查询加载父记录,然后为每条记录触发另一个SQL语句以加载相关的孩子。 假设您有以下Ecto模式 defmodule User do use Ecto . ...
テーブル设计使用者柱子类型选项昵称细绳null:假电子邮件细绳null:假加密密码细绳null:假介绍文本图像文件协会has_many:文章has_many:评论has_many:like_articles has_many:like_users has_many:用户标签has...
通过关联通过belongs_to,has_many和has_many查询关联。 遍历视图中的关联并显示主要实例的关联数据。 通过has_many识别联接模型。 概述 我们已经看到了如何使用简单的关联在Rails中向我们的用户显示数据,但是更...
__Firefox_Focus_(iOS)_has_moved_to_a_new_reposito_focus-iosreposito_Focus-iOS__Firefox_Focus_(iOS)_has_moved_to_a_new_reposito_focus-ios.zip
消息has_many:tags,通过:tag_users has_many:tag_users has_many:职位has_many:评论房间表柱子类型选项姓名细绳null:假协会has_many:room_users has_many:users,通过:room_users has_many:消息当属:...
数据库设计 用户表 ... column_physical column_logic ...has_many:评估,通过:: user_evaluation has_many:产品,通过::喜欢 has_one:user_profile has_one:user_address has_one:送货地址 h
has_many:关系 has_many:sns_credentials 帖子テーブル 柱 类型 选件 标题 串 null:假 说明 文本 category_id 整数 null:假 动物名 串 用户 参考资料 null:false,foreign_key:true 协会 当属:用户 has_many...
has_many:关系 has_many:之后,通过::relationships has_many:reverse_of_relationships has_many:关注者,通过::reverse_of_relationships has_many:评论 has_many:尝试 has_many:答案 归属_活动_...
餐桌设计用户表柱子类型选项姓名细绳null:假电子邮件细绳null:假密码细绳null:假身份细绳协会has_many:user_groups has_many:groups,通过::user_groups has_many:日历has_many:聊天组表柱子类型选项姓名...
Here_is_a_collection_of_repository_that_has_applie_Software-CopyrightSoftware-Copyright.zip
Rails提供了四种基本的关联类型:` belongs_to`、` has_one`、` has_many` 和 `has_and_belongs_to_many`。这些关联允许我们建立对象之间的关系,从而在编程时简化数据的存取。 1. `belongs_to` 关联: 这种关联...
THIS_REPOSITORY_HAS_MOVED_TO_github.comnvidiacub_cub
has_many:like_messages,通过::likes,来源::message 消息テーブル 柱子 类型 选项 标题 文本 null:假 内容 文本 null:假 用户身份 整数 null:false,foreign_key:true 图像 细绳 category_id 整数 ...