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]
,你是如何搜索它的?当然是的。我可以。但这不是我能得到的。请参阅其他答案。谢谢,我明白了。也许我误解了这个问题。很高兴你修好了。谢谢,你让我开心!谢谢,你让我开心!当你的问题解决时,请考虑接受别人的通知。当你的问题得到解决时,请考虑接受别人的通知。