客户关系管理插件 has_many_customers

感谢大家批阅 :)

客户关系管理插件 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
加入:
[code]
##
#设计关系类型 belongs_to :advisor, :foreign_key=> "user_id",:class_name=> "User::User" belongs_to :customer, :foreign_key=> "customer_id", :class_name=> "User::User"
[/code]

测试和用法
[code]
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"
[/code]

感谢大家批阅 :)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值