我有以下型号:
# 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;
答案 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
。