我想在我的模型中结合两个不同的范围。我有这个:
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
答案 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。
或者,更好的是,修改数据库结构。