结合两个轨道每种方法按最低价格订购

时间:2017-09-15 23:26:03

标签: ruby-on-rails

继承我的代码

  <% @event.skiddle_tickets.reorder(:face_value).each do |skiddle| %>
  <% if skiddle.quantity == "0 available" || skiddle.face_value == "0.00" || skiddle.name["Coach"] %>
<% else %>
  <div class="panel panel-default">
    <div class="panel-body">
      <div class="col-md-8">

        <p>
          <strong><%= skiddle.name %></strong>
        </p>
        <p>
          <%= number_to_currency(skiddle.face_value.to_f + skiddle.booking_fee.to_f, unit: "£") %>
        </p>
        <p>
          <%= link_to "Buy Now", @event.skiddle_url, class: "btn btn-info" %>
        </p>

      </div>
      <div class="col-md-4" align="center" style="border-left-style: dotted; padding:27px 0">
        <%= image_tag("skiddle-logo.png", style: "width: 140px") %>
      </div>
    </div>
  </div>
  <% end %>
  <% end %>
  <% @stubhub_tickets.each do |stubhub| %>
  <div class="panel panel-default">
    <div class="panel-body">
      <div class="col-md-8">

        <p>
          <strong><%= stubhub["sectionName"] %></strong>
        </p>
        <p>
          <%= number_to_currency(stubhub["currentPrice"]["amount"], unit: "£") %>
        </p>
        <p>
          <%= link_to "Buy Now", @event.skiddle_url, class: "btn btn-info" %>
        </p>

      </div>
      <div class="col-md-4" align="center" style="border-left-style: dotted; padding:14px 0">
        <%= image_tag("stubhub-logo.png", style: "width: 140px") %>
      </div>
    </div>
  </div>
  <% end %>

这些显然是每种方法两种,问题在于其中一种堆叠在另一种上。我想要的是将门票一起订购而不是单独订购。

这样做的最佳方法是什么?我认为将两个选择器组合在一起,然后按价格排序,但价格从后端不同,重命名是一场噩梦。

如果需要,我可以使用javascript或任何其他类型的解决方案。

修改

所以我没有完全理解第二部分,如果需要,还会打开另一个问题。

所以我试图将售票员添加到组合中,Ticketmaster只有一个价格。

到目前为止,这是

ticketmaster = Ticketmasters.where(merchant_product_id: @event.ticketmaster)
stubhub = []
skiddle = @event.skiddle_tickets.sort_by {|x| [x.face_value + x.booking_fee] }
if @stubhub_tickets.present?
  stubhub = @stubhub_tickets.sort_by {|x| x['currentPrice']['amount'] }
end


@sort = []


loop do
  # break if skiddle.empty? || stubhub.empty?
  @sort << ((skiddle.first.face_value + skiddle.first.booking_fee).to_f < stubhub.first['currentPrice']['amount'].to_f < ticketmaster.search_price ? skiddle.shift() : stubhub.shift(): ticketmaster.shift())
end

@tickets = @sort + skiddle + stubhub + ticketmaster

1 个答案:

答案 0 :(得分:1)

由于您需要对2个不同的数组进行排序,我将尝试将问题分为两个阶段:

1。为每个阵列订购 2. :创建一个新数组,比较两个数组的第一个元素,并将该元素放入新数组,然后重复直到一个数组为空。最后,将其余数组添加到新数组中。

所以我会在你的控制器中尝试这样的事情:

# sort skiddle_tickets and stubhub_tickets
skiddle = event.skiddle_tickets.sort_by {|x| [x.face_value + x.booking_fee] }
stubhub = stubhub_tickets.sort_by {|x| [x.currentPrice.amount] }

#merge both sorted arrays in a single one
@sort = []

loop do
  break if skiddle.empty? || stubhub.empty?
  @sort << ((skiddle.first.face_value + skiddle.first.booking_fee) < stubhub.first.currentPrice.amount ? skiddle.shift() : stubhub.shift())
end

@sort_list = @sort + skiddle + stubhub

然后你可以在你的视图中迭代@sort_list,但是你必须在每次迭代时检查元素是否是skiddle或stubhub以便提供正确的打印。

编辑:

这里是Shift()的文档。

编辑2:

由于OP正在努力解决这个问题,这里有一个更为一般的解释。

假设您有3个价格为的模型:

ModelA => The price is face_value + booking_fee
ModelB => The price is current_price
ModelC => The price is in my_price

我们说我们有这个价值观:

|           ModelA         | price |
|--------------------------|-------|
| face_value + booking_fee |  800  |
| face_value + booking_fee |  400  |
| face_value + booking_fee |  100  |

|    ModelB     | price |
|---------------|-------|
| current_price |  600  |
| current_price |  900  |
| current_price |  200  |


|    ModelC     | price |
|---------------|-------|
| my_price      |  500  |
| my_price      |  500  |
| my_price      |  300  |

目标是按价格的升序对所有值(来自3个模型)进行排序,这是我的方法。

第1步:对所有数组进行排序:

modelA = ModelA.all.sort_by {|x| [x.face_value + x.booking_fee] }
modelB = ModelB.all.sort_by {|x| [x.current_price] }
modelC = ModelC.all.sort_by {|x| [x.my_price] }

现在,您已将所有数组排序,如下所示:

|           ModelA         | price |
|--------------------------|-------|
| face_value + booking_fee |  100  |
| face_value + booking_fee |  400  |
| face_value + booking_fee |  800  |


|    ModelB     | price |
|---------------|-------|
| current_price |  200  |
| current_price |  600  |
| current_price |  900  |


|    ModelC     | price |
|---------------|-------|
| my_price      |  300  |
| my_price      |  500  |
| my_price      |  500  |

第2步:比较数组的所有第一个元素,找到最低的:

|           ModelA        | price |
|-------------------------|-------|
| face_value + booking_fee|  100  |

|    ModelB     | price |
|---------------|-------|
| current_price |  200  |

|    ModelC     | price |
|---------------|-------|
| my_price      |  300  |

现在您拥有所有阵列的最低价格。

第3步:删除原始数组中的最低位并将其插入新数组中:

插入:

|         new_array        | price |
|--------------------------|-------|
| face_value + booking_fee |  100  |

删除:

|           ModelA         | price |
|--------------------------|-------|
| face_value + booking_fee |  100  |

所以,现在你拥有的是新阵列中插入的所有价格中最低的。

重复第2步,这里的神奇之处在于阵列已经排序并且最低价格已被删除,所以你现在拥有的是剩余价格。