结合许多范围

时间:2017-11-09 10:44:50

标签: ruby-on-rails ruby scope

我想在我的模型中结合两个不同的范围。我有这个:

Post_model

scope :with_tasks, -> { where(cat: 3).includes(:user).includes(task: :users) }
scope :with_events, -> { where(cat: 4).includes(:user).includes(event: :users) }
scope :with_comments, -> {where(comented: true).includes(comments: :user)}

Post_controller

def index 
  @posts = current_user.posts.with_tasks + current_user.posts.with_events
end 

但我认为实现它并不是一种非常优雅的方式,我不能包括评论范围。

您是否知道将此范围加入新范围的方法(如下例所示)?

scope :with_elements, -> { self.with_tasks.merge(self.with_events) }

什么允许我将此方法称为post#index

@posts = current_user.posts.with_elements

1 个答案:

答案 0 :(得分:0)

TASKS = 3
EVENTS = 4
scope :with_tasks_and_or_events, ->(cat) { 
  cond = {}.tap do |c|
    c.merge!(task: :users) if cat.include? TASKS
    c.merge!(event: :users) if cat.include? EVENTS
  end

  where(cat: cat).includes(:user).includes(**cond)
}

并使用它:

with_tasks_and_or_events([TASKS])
with_tasks_and_or_events([TASKS, EVENTS])

或者,更好的是,使用Relational Algebra

或者,更好的是,修改数据库结构。