Ruby on Rails:从数组中排除元素

时间:2015-02-05 18:06:44

标签: ruby-on-rails ruby

我是初学者,以下很多内容可能不正确/不是最佳,但到目前为止它都有效!我在学习,但有一点我无法弄清楚该怎么做:

我有一组图片。这些是@fsets。我想在3的字段中显示集合中的一个图像,但确保没有重复。因此,如果我有一个[image1,image2,image3,image4]数组,用户可以选择image2并显示其他2个从剩余图像中选择的图像。在我的控制器中,我有:

  def rotator
    @fset = Fset.find(params[:id])    
    @image = Exemplar.find(params[:image])    
    @setdistractora = @fset.line_items.sample
    @setdistractorb = @fset.line_items.sample
  end

第一行根据url中的:id查找集合。 第二个基于url中传递的:image参数查找所选图像。 第三行和第四行从同一组中获取两个随机图像,与其他两个图像相同。

这是我首先写的开始,但我确信有更好的方法来做事。为了尝试解决无重复图像问题,我尝试了:

 @remainingset = @fset - @image
 @setdistractora = @fset.line_items.sample
 @setdistractorb = @fset.line_items.sample

那没有用......所以我试过

 @remainingset = [@fset] - [@image] 

返回一个数组,但我不能使用line_items关联来调用图像。

任何人都可以帮忙吗?谢谢!

******编辑1 ******

添加关系

class Exemplar < ActiveRecord::Base
  mount_uploader :image, ImageUploader  
  has_many :line_items
  has_many :fsets, through: :line_items

class Fset < ActiveRecord::Base  
  has_many :line_items, dependent: :destroy

class LineItem < ActiveRecord::Base
  belongs_to :fset
  belongs_to :exemplar

******编辑2 ******

嗯......我解决了我的问题,虽然可能有更好的方法。这是我改变的。

对于Fset类我添加了一个has_many到:

 class Fset < ActiveRecord::Base  
      has_many :line_items, dependent: :destroy
      has_many :exemplars, through: :line_items

这清理了我的很多观点并使它们更具可读性,并允许我在控制器中执行此操作:

@fset = Fset.find(params[:id])    
@image = Exemplar.find(params[:image])    
@subset = @fset.exemplars - [@image]
  @setdistractora = @subset.sample
@subsetb = @subset - [@setdistractora]
  @setdistractorb = @subsetb.sample

现在在我看来:

<div class="rotate">            
<%= image_tag @image.image_url(:thumb) %>
</div>

<div class="rotate">        
<%= image_tag @setdistractora.image_url(:thumb) %>                          
</div>  

<div class="rotate">            
<%= image_tag @setdistractorb.image_url(:thumb) %>                          
</div>  

因此每张图片现在都是独一无二的。感谢下面的回复,因为他们帮助我思考我可以去哪里解决这个问题。

1 个答案:

答案 0 :(得分:3)

@fset是一个数组,对吗?

您可以从数组中减去数组:

[4,3,2,1] - [2] # -> [4,3,1]

所以它应该是:

@remainingset = @fset - [@image]