Ruby on rails Rails:将当前用户的已发布项和未发布项显示为ActiveRecord::Relation

Ruby on rails Rails:将当前用户的已发布项和未发布项显示为ActiveRecord::Relation,ruby-on-rails,ruby,activerecord,rails-activerecord,Ruby On Rails,Ruby,Activerecord,Rails Activerecord,我想知道是否可以同时做以下两件事: 查看状态为“已发布”的所有项目 查看具有任何状态的当前用户的项目 我有以下代码: # Item model scope :published, -> { where(status: 'published') } scope :unpublished, -> { where.not(status: 'published') } scope :by_user, -> (user_id) { where(user: user_id) } #

我想知道是否可以同时做以下两件事:

  • 查看状态为“已发布”的所有项目
  • 查看具有任何状态的当前用户的项目
我有以下代码:

# Item model
scope :published, -> { where(status: 'published') }
scope :unpublished, -> { where.not(status: 'published') }
scope :by_user, -> (user_id) { where(user: user_id) }

# Item controller
def index
 @items = Item.published + Item.unpublished.by_user(current_user.id)
end
问题是
@items
是一个
数组
,但我想要
ActiveRecord::Relation

如果你想知道我为什么需要这个,答案很简单:

@items.find(params[:id])

根据中的讨论,我认为您至少有四种选择:

1) 编写一个结合现有范围的范围,例如:

scope :published_or_unpublished_by_user, -> (user_id) { where('status = ? OR (status != ? and user = ?)', 'published', 'published', user_id) }
2) 使用宝石般的宝石

3) 使用


4) 等待Rails 5中出现
语法。

根据中的讨论,我认为您至少有四个选项:

1) 编写一个结合现有范围的范围,例如:

scope :published_or_unpublished_by_user, -> (user_id) { where('status = ? OR (status != ? and user = ?)', 'published', 'published', user_id) }
2) 使用宝石般的宝石

3) 使用


4) 等待Rails 5中出现的
语法。

我知道,您正在尝试从当前用户中查找未发布的项目。你可以在我的范围内做

scope :current_user_not_published, ->(user_id) 
      {where('status != ? AND user = ?', 'published', user_id)}
控制器:

# Item controller
def index
 @published_items = Item.published
 @current_user_unpublished_utems = Item.current_user_not_published(current_user.id)
end


我明白了,您正试图从当前用户中查找未发布的项目。你可以在我的范围内做

scope :current_user_not_published, ->(user_id) 
      {where('status != ? AND user = ?', 'published', user_id)}
控制器:

# Item controller
def index
 @published_items = Item.published
 @current_user_unpublished_utems = Item.current_user_not_published(current_user.id)
end


Rails 4.x还不支持
UNION
查询,因此我建议使用一个新的范围,将其他范围与子查询相结合(数据库应该能够优化它们):

请注意,当您希望合并现有范围时,上述是一种通用解决方案。在此特定示例中,您可以通过优化范围获得更好的性能:

scope :visible_for_user, ->(user) { 
  where("items.status = 'published' OR items.user_id = ?", user.id)
}

Rails 4.x还不支持
UNION
查询,因此我建议使用一个新的范围,将其他范围与子查询相结合(数据库应该能够优化它们):

请注意,当您希望合并现有范围时,上述是一种通用解决方案。在此特定示例中,您可以通过优化范围获得更好的性能:

scope :visible_for_user, ->(user) { 
  where("items.status = 'published' OR items.user_id = ?", user.id)
}

@items
是一个
数组
,因此我无法执行
@items.find(params[:id])
@items=Item.published
成为对象数组后,您无法使用activerecord方法查找它。这也是索引页,你是如何获得
参数[:id]
,你是如何搜索它的?当然是的。我可以。但这不是我能得到的。请参阅其他答案。谢谢,我明白了。也许我误解了这个问题。很高兴你修复了它。
@items
是一个
数组
,因此我无法执行
@items.find(params[:id])
@items=Item.published
成为对象数组后,你无法使用activerecord方法查找它。这也是索引页,你是如何获得
参数[:id]
,你是如何搜索它的?当然是的。我可以。但这不是我能得到的。请参阅其他答案。谢谢,我明白了。也许我误解了这个问题。很高兴你修好了。谢谢,你让我开心!谢谢,你让我开心!当你的问题解决时,请考虑接受别人的通知。当你的问题得到解决时,请考虑接受别人的通知。