我的模型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?
答案 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')