__ 所有的代码直接手撸、没有验证过 直接在 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