使用Rails 4.1

时间:2016-09-21 17:08:46

标签: ruby-on-rails postgresql ruby-on-rails-4 activerecord

我有以下型号:

#  web_page_id        :integer
class Bookmark < ActiveRecord::Base
  belongs_to :web_page
end

class WebPage < ActiveRecord::Base
  has_many :bookmarks
end

class BookmarkGroup < ActiveRecord::Base
  has_many :bookmarks
  has_many :web_pages, through: :bookmarks
end

WebPage有一个状态字段,我正在尝试获取最新的5000个书签(created_at DESC)或其WebPage状态为nil的BookmarkGroup的web_page_ids。获取书签对象可以使用以下查询:

bookmark_group.bookmarks.joins(:web_page).where(web_pages: {status:nil}).order('created_at DESC').limit(5000)

但是,我只想获取web_page_ids而不必在内存中加载5000个Bookmark模型实例,但是当我在最后使用pluck(:web_page_id)时,我得到了&#39; PG :: AmbiguousColumn:ERROR :列引用&#34; created_at&#34;是模糊的&#39;如果我按照这样的顺序引用书签:

bookmark_group.bookmarks.joins(:web_page).where(web_pages: {status:nil}).order('bookmarks.created_at DESC').limit(5000).pluck(:web_page_id)

我得到:PG :: UndefinedTable:错误:缺少FROM-clause条目表#34;书签&#34;

1 个答案:

答案 0 :(得分:2)

我们在讨论中发现bookmarks的实际表名是os_items,因此有两个选项:

直接的:

bookmark_group.bookmarks.joins(:web_page).
  where(web_pages:{status:nil}).
  order('os_items.created_at DESC').
  limit(5000).
  pluck(:web_page_id)

(也可能:.order("#{Bookmark.table_name}.created_at DESC")

请记住,Rails会将当前范围持有者的表名称放在:

bookmark_group.bookmarks.joins(:web_page).
  where(web_pages: {status:nil}).
  order(created_at: :desc).
  limit(5000).
  pluck(:web_page_id)

如果web_pages merge执行顺序,则会有所帮助:.merge(WebPage.order(created_at: :desc))

另一种选择是使用Arel