Rails 里面的 merge

__ 所有的代码直接手撸、没有验证过 直接在 MarkDown 里写的 QAQ __

有一些编码风格 & APi设计的时候嵌套风格 & APi错误处理风格夹杂在其中

待完善

背景模型

# 团队 - 拥有团队的项目 & 团队的成员
# 用户 - 有可以访问的多个项目
# 项目 - 归属于某个团队 & 项目有很多的成员
# 访问 - 用来记录用户 & 项目之间的权限

class Team < ApplicationRecord
  has_many :users
  has_many :projects
end

class User < ApplicationRecord
  has_many   :teams
  has_many   :accesses
  has_many   :projects, through: :accesses               # 这里就是用户能访问的项目
end

class Profile < ApplicationRecord
  self.table_name = "user_profile"
  has_one :user
end

class Access < ApplicationRecord
  belongs_to :project
  belongs_to :user
end

class Project < ApplicationRecord
  belongs_to :team
  has_many   :accesses
  has_many   :members, through: :accesses, source: 'user' # 项目有很多成员
end

合并复杂查询

  • 需求: 查询 当前用户 在 当前团队 的 所有有权限访问 的项目

class BaseController < ApplicationController
  before_action : current_user
  
  def current_user
    @current_user ||= User.first
  end
end

module Teams
  class BaseController < ::BaseController
    before_action :current_team
     
    def current_team
      @current_team ||= User.first
    end
  end
end

module Teams
  class ProjectsController < BaseController
    def index
      @projects = @current_team.projects.merge(@current_user.projects)
    end
  end
end
  • 需求: 根据 Profile 里面记录的生日 对用户进行排序
class UsersController < BaseController 
  def index
    #where 属于乱入 & 这里是一些比较常见的写法
    #@users = User.joins(:profile).where("user_profile.address LIKE ?", 'HANG').order("user_profile.birth_day")
    users = load_users
  end
  
  private
  def load_users
    users = User.includes(:profile).joins(:profile).merge(Profile.order(:birth_day))
    raise ErrorOnUsersControllerIndexMethod unless users
    return users
  end

end

你可能感兴趣的:(Rails 里面的 merge)