继承我的代码
<% @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
答案 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()的文档。
由于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步,这里的神奇之处在于阵列已经排序并且最低价格已被删除,所以你现在拥有的是剩余价格。