Rails提取所包含数据的每个属性

时间:2018-04-25 18:16:06

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

我有一个CreateMap<HierarchicalObject, FlattenedObject>() .ReverseMap(); 控制器,用于为conversations类型的用户提取所有对话。

卖家可以seller products purchased buyersproduct可以免费。对于会话列表,每个buyer都会被标记为clientlead,具体取决于以下因素:

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方法中,我进行了以下检查以检查buyerclient还是{{{ 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已与usersconversations型号

相关联

buyer/seller - &gt;检查purchases是否为buyer

client/lead - &gt; user buyersname

1 个答案:

答案 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)