当只需要一个图像时,Rails输出两个图像

时间:2016-12-12 16:29:41

标签: ruby-on-rails ruby

我目前正在开展一个项目,要求我创建一个(真实的)房地产经纪人网站。我已导入包含所有属性的XML列表并创建了数据库,但是当我创建属性列表并为每个属性插入第一个图像时,它会创建两个图像(列表中的每个属性一个)并分配两个图像到每个房产。

代码是:

<% @properties.each do |property| %>
      <div class="row">
        <div class="col-sm-12">

          <div class="row">
            <div class="col-sm-3">
              <% property.pictures.each do |picture| %>
                  <% if picture.name.eql?('Photo 10') %>
                      <img src="<%= picture.url %>" class="img-responsive center-block"/>
                  <% end %>
              <% end %>
            </div>
            <div class="col-sm-9">
              <h4><%= property.advert_heading %></h4>
              <p><%= property.main_advert %></p>
            </div>
          </div>

        </div>
      </div>
  <% end %>

html输出为:

<div class="row">
        <div class="col-sm-12">

          <div class="row">
            <div class="col-sm-3">
                      <img href="http://med01.expertagent.co.uk/in4glestates/{376a3e5b-f940-4181-bc8e-255859c03e51}/{0b306ad6-63d3-4af2-a3ac-0dfa0885b724}/main/P1000507.jpg" class="img-responsive center-block"/>
                      <img href="http://med01.expertagent.co.uk/in4glestates/{376a3e5b-f940-4181-bc8e-255859c03e51}/{5004cf3b-e189-48e9-a1a6-f029e402ddd3}/main/P1000507.jpg" class="img-responsive center-block"/>
            </div>
            <div class="col-sm-9">
              <h4>Pen Y Bryn, Llanfairfechan</h4>
              <p>A semi detached three bedroom family home located in a quiet cul de sac in the upper part of the village of Llanfairfechan.  The property benefits from double glazed windows, gas central heating, gardens to front and rear.  This would make an ideal family home or investment property.</p>
            </div>
          </div>

        </div>
      </div>
      <div class="row">
        <div class="col-sm-12">

          <div class="row">
            <div class="col-sm-3">
                      <img href="http://med01.expertagent.co.uk/in4glestates/{376a3e5b-f940-4181-bc8e-255859c03e51}/{0b306ad6-63d3-4af2-a3ac-0dfa0885b724}/main/P1000507.jpg" class="img-responsive center-block"/>
                      <img href="http://med01.expertagent.co.uk/in4glestates/{376a3e5b-f940-4181-bc8e-255859c03e51}/{5004cf3b-e189-48e9-a1a6-f029e402ddd3}/main/P1000507.jpg" class="img-responsive center-block"/>
            </div>
            <div class="col-sm-9">
              <h4>33, Pen Y Bryn, Llanfairfechan LL33 0UH</h4>
              <p>A semi detached three bedroom family home located in a quiet cul-de-sac in the upper part of Llanfairfechan village.  The property benefits from double glazed windows, gas central heating, gardens to front and rear.  Restrictions apply.  Application fees apply. Deposit: &amp;pound;750.</p>
            </div>
          </div>

        </div>
      </div>

对我而言,似乎rails正在遍历property.picture.each两次(或者如果我有更多属性,我会猜测更多)并插入输出两次,但我不明白为什么。< / p>

非常感谢

2 个答案:

答案 0 :(得分:1)

看起来您有重复的图片,其名称属性为“Photo 10”。使用rails控制台运行查询以确认这一点。

Picture.where(name: 'Photo 10').count

返回多少条记录?您是否期望每个房产都有一张名为“Photo 10”的照片?如果是这样,您应该期望返回多个图片作为属性,如果没有,那么您有每个属性名称为“Photo 10”的重复条目。这让我想到了下一点。

你应该normalize your database。您依赖于非唯一属性,并且有多个图片条目指向同一个URL的事实告诉我。您还在图片表中创建了许多不必要的图片条目。相反,我会在属性和图片之间创建一个连接表,可能称为PropertyPictures。对于每个唯一的图片网址,请在图片表格中创建一个条目。对于使用图片的每个属性,在连接表中使用该property_id和所需图片的picture_id创建一个条目。这将有助于您的图片更改。正如你现在所拥有的那样,如果一个图片网址发生变化,它就不会在所有地方都发生变化,即使它应该也是如此。就你的观点而言,既然你有一个独特而一致的picture_id,那么使用它,就不可能有重复。此外,而不是拉所有图片,只需得到你想要的。您可以在属性模型中编写一个方法来执行此操作。它可能看起来像这样:

def special_picture
   pictures.where(id: 1)
end

在你看来:

<% @properties.each do |property| %>
      <div class="row">
        <div class="col-sm-12">

          <div class="row">
            <div class="col-sm-3">
                      <img src="<%= property.special_picture.url %>" class="img-responsive center-block"/>
            </div>
            <div class="col-sm-9">
              <h4><%= property.advert_heading %></h4>
              <p><%= property.main_advert %></p>
            </div>
          </div>

        </div>
      </div>
  <% end %>

`

答案 1 :(得分:0)

如果您只想要每个商家信息的第一张图片,为什么要循环浏览每个商家信息的所有图片?

你可以这样做:

<div class="col-sm-3">
  <img src="<%= property.pictures.first.url %>" class="img-responsive center-block"/>
</div>