我是初学者,以下很多内容可能不正确/不是最佳,但到目前为止它都有效!我在学习,但有一点我无法弄清楚该怎么做:
我有一组图片。这些是@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>
因此每张图片现在都是独一无二的。感谢下面的回复,因为他们帮助我思考我可以去哪里解决这个问题。
答案 0 :(得分:3)
@fset
是一个数组,对吗?
您可以从数组中减去数组:
[4,3,2,1] - [2] # -> [4,3,1]
所以它应该是:
@remainingset = @fset - [@image]