Rails ActiveRecord - 查询关系的最后记录

时间:2015-08-04 10:51:42

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

我的模型SET IDENTITY_INSERT UTS_USERCLIENT_MAPPING_USER_LIST ON INSERT INTO UTS_USERCLIENT_MAPPING_USER_LIST ([MAPPING_ID], [USER_ID], [USER_EMAIL_ID], [USER_CREATED_DATE], [USER_IS_ACTIVE]) SELECT [MAPPING_ID], [USER_ID], [USER_EMAIL_ID], [USER_CREATED_DATE], [USER_IS_ACTIVE] FROM #tempXML SET IDENTITY_INSERT UTS_USERCLIENT_MAPPING_USER_LIST OFF Book有一个has_many关系。

State

class Book < ActiveRecord::Base has_many :states ... end 通过State属性将图书的可见性设置为“私有”,“受限制”或“公开”。出于审计目的,我们会记录所有状态变化,以便获取我使用的书籍的当前状态

name

现在我需要查询当前状态为public的所有> book = Book.first > book.states.last.name > "public" 个对象。

有些事情:

Book

问题是上面的查询会返回当前公开或过去已公开的所有图书。我只希望它返回当前“公开”的书籍(即book.states.last.name ==“public”)。

我知道我可以用select来做,但是为每条记录生成一个查询:

Book.joins(:visibility_states).where(states: { state: "public"})

有没有办法只使用ActiveRecord?

2 个答案:

答案 0 :(得分:2)

您可以使用窗口功能:

Book.joins(:visibility_states)
    .where(states: { state: "public"})
    .where("visibility_states.id = FIRST_VALUE(visibility_states.id)
            OVER(PARTITION BY books.id ORDER BY visibility_states.created_at DESC))")

或者在你的情况下,最好在Book model中保存当前状态

答案 1 :(得分:1)

我会做更好的表现。

如果要保存历史状态更改,可以。但请尽量避免因此而为您的应用程序带来更多复杂性。

为什么不在Book模型中添加 current_state 属性?

它会更快,更容易开发。

class Book < ActiveRecord::Base

  def set_new_current_state!(new_state)
     self.current_state = new_state # e.g State.public
     self.stats << State.create(new_state)
  end
end

您的查询就是这样:

Book.where(current_state: 'public')