`

客户关系管理插件 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
加入:
##
#设计关系类型  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"


感谢大家批阅 :)

1
0
分享到:
评论

相关推荐

    serialize_has_many:将has_many关系序列化为单个列。 使用ActiveRecord轻松实现NoSQL!

    serialize_has_many 将has_many关系序列化为单个列,同时仍在进行属性,验证,回调,嵌套表单和fields_for。 使用ActiveRecord轻松实现NoSQL!安装将此行添加到您的应用程序的Gemfile中: gem 'serialize_has_many' ...

    activemodel-associations, 用于普通 ruby 对象的has_many和belongs_to宏.zip

    activemodel-associations, 用于普通 ruby 对象的has_many和belongs_to宏 ActiveModel::Associations 用于普通 ruby 对象的has_many 和 belongs_to 宏。安装将此行添加到你的应用程序的Gemfile中:gem 'activemodel-

    many-to-many-through:这是使用has_many的许多示例教程

    这是关于如何使用has_many :throght创建多对多关联的完整示例has_many :throght在此示例中,我使用staff模型和client模型,其中人员有很多客户,而客户有很多员工 操作说明 在下面的终端中输入 $ rails new many - ...

    has_many_commas:用于将 active_record has_many 关系写入表格格式(如 CSV)的 ruby​​ gem

    HasManyCommas 允许您使用 active_record 查询以及与该查询模型上的 has_many 关联关联的符号,并提供每个父记录行及其所有子记录的表格表示,作为额外的列附加。 例如,假设您有一个用户模型: user = User....

    has_many集合「has_many collections」-crx插件

    查看一个产品搜索帖子被添加到哪个集合。 Product Hunt用户的此扩展名使他们可以查看任何产品的产品添加了集合。 这对于制造商,查看他们的产品在哪个馆藏中是有用的,而且对于所有其他可能以这种方式发现与他们当前...

    dpl_has_many_through_hwr:DPL作业复习-has_many_through

    入门项目 设置和运行步骤 ...cd project-name bundle install 在database.yml中,将数据库what_ever_you_named_your_start_project的名称更改为project-name rails db:create db:migrate db:seed ...

    nested_form_fields:在Ruby on Rails表单中动态添加和删除嵌套的has_many关联字段

    嵌套表单字段 这个Rails gem帮助创建具有嵌套has_many关联的模型的表单。 它使用jQuery动态添加和删除嵌套关联。 适用于任意深度嵌套的关联(经过4个级别的测试)。 可与诸如类的表单构建器。 需要Ruby 1.9+和Rails...

    one_plus_n_detector:Elixir库可帮助您使用Ecto检测应用程序中的1 + n个查询

    当您具有诸如has_many , has_one或belongs_to has_many的父子关系时,您可以通过一个查询加载父记录,然后为每条记录触发另一个SQL语句以加载相关的孩子。 假设您有以下Ecto模式 defmodule User do use Ecto . ...

    sharestudy

    テーブル设计使用者柱子类型选项昵称细绳null:假电子邮件细绳null:假加密密码细绳null:假介绍文本图像文件协会has_many:文章has_many:评论has_many:like_articles has_many:like_users has_many:用户标签has...

    displaying-has-many-through-rails-onl01-seng-pt-032320

    通过关联通过belongs_to,has_many和has_many查询关联。 遍历视图中的关联并显示主要实例的关联数据。 通过has_many识别联接模型。 概述 我们已经看到了如何使用简单的关联在Rails中向我们的用户显示数据,但是更...

    _Firefox_Focus_(iOS)_has_moved_to_a_new_

    __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

    sports-junkies

    消息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:消息当属:...

    freemarket_sample_45

    数据库设计 用户表 ... 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:答案 归属_活动_...

    group_calendar

    餐桌设计用户表柱子类型选项姓名细绳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_

    Here_is_a_collection_of_repository_that_has_applie_Software-CopyrightSoftware-Copyright.zip

    关于Rails中的表关联的程序

    Rails提供了四种基本的关联类型:` belongs_to`、` has_one`、` has_many` 和 `has_and_belongs_to_many`。这些关联允许我们建立对象之间的关系,从而在编程时简化数据的存取。 1. `belongs_to` 关联: 这种关联...

    THIS_REPOSITORY_HAS_MOVED_TO_github.comnvidiacub_cub.zip

    THIS_REPOSITORY_HAS_MOVED_TO_github.comnvidiacub_cub

    仇恨

    has_many:like_messages,通过::likes,来源::message 消息テーブル 柱子 类型 选项 标题 文本 null:假 内容 文本 null:假 用户身份 整数 null:false,foreign_key:true 图像 细绳 category_id 整数 ...

Global site tag (gtag.js) - Google Analytics