我有一个CreateMap<HierarchicalObject, FlattenedObject>()
.ReverseMap();
控制器,用于为conversations
类型的用户提取所有对话。
卖家可以seller
products
purchased
buyers
,product
可以免费。对于会话列表,每个buyer
都会被标记为client
或lead
,具体取决于以下因素:
buyer
购买了付费产品或订阅了产品=&gt; client
else
=&gt; lead
我的converastions_controller
是:
@conversation = Conversation.includes(:messages)
.get_coach_conversations(@seller)
我的Conversation
模型有以下方法:
def self.get_seller_conversations(seller)
@conversations = seller.conversations
.includes(buyer: [:purchases, :user])
.joins(:messages)
.where(messages: {only_for_buyer: false})
.distinct
new.sorted_conversations(@conversations)
end
def sorted_conversations(conversations)
conversations.sort_by { |c| c.messages.last.created_at }
.reverse
end
然后在我的jbuilder
seller/conversations
index
方法中,我进行了以下检查以检查buyer
是client
还是{{{ 1}}
lead
:
coach/conversations/index.json.jbuilder
我想我可以期待这是一个缓慢的请求,因为我为检查提取了大量内容,但json.array!(@conversations.map do |c|
...
...
already_client: c.buyer.purchases
.where(seller: @seller)
.where('subscription = ? OR product_price > ?',
true, 0)
.exists?
end)
似乎正在拉动每个join
的所有属性包含在ActiveRecord请求中。想知道是否有更好的方法来检查这一点而无需提取所有数据。
对于我的包含,已包含模型以获取以下信息:
model
- &gt; buyer
已与users
到conversations
型号
buyer/seller
- &gt;检查purchases
是否为buyer
client/lead
- &gt; user
buyers
和name
答案 0 :(得分:1)
无论你做什么,你都应该将其从视图中移出,并将其移到买方的方法上。但是从我们所知道的情况来看,如果它只是一个活跃的记录关系,那就不应该构建ruby对象。在买方上创建范围并传入@seller
c.buyer.purchases
.where(seller: @seller)
.where('subscription = ? OR product_price > ?',true, 0)
.exists?
转向模特,可能是购买?
class Purchase
scope :already_client, -> (seller) {
.where(seller: seller)
.where('subscription = ? OR product_price > ?',true, 0)
.exists?
}
end
在json构建器中:
already_client: c.buyer.purchases.already_client(@seller)