ActiveRecord .select():可以清除旧选择吗?

时间:2011-02-11 07:40:34

标签: ruby-on-rails-3

有没有办法清除.select(“table.col1,...”)语句中的旧选择?

背景:

我有一个范围,可以为给定的用户ID(简化)

请求可访问的项目
    scope :accessible, lambda { |user_id|
  joins(:users).select("items.*")
    .where("items_users.user_id = ?) OR items.created_by = ?", user_id, user_id)
}

然后例如在索引动作中我只需要项目ID和标题,所以我会这样做:

@items = Item.accessible(@auth.id).select("polls.id, polls.title")

但是,这将选择列“items。,items.id,items.title”。我想避免从范围中删除选择,因为那时我必须在其他地方添加一个选择(“items。”)。我是否正确地认为没有办法做到这一点,我要么生活在获取太多字段或者必须使用多个范围?

2 个答案:

答案 0 :(得分:48)

幸运的是你错了:D,你可以使用#except方法删除关系所产生的查询的某些部分,所以如果要删除SELECT部分​​,只需执行以下操作:

@items = Item.accessible(@auth.id).except(:select).select("polls.id, polls.title")

答案 1 :(得分:5)

重新选择(滚动6 +)

Rails 6引入了一种名为reselect的新方法,该方法完全可以满足您的需要,它代替了先前设置的select语句。

现在,您的查询可以写得更短:

@items = Item.accessible(@auth.id).reselect("polls.id, polls.title")