has_many上的访问属性

时间:2016-02-22 16:25:16

标签: ruby-on-rails ruby ruby-on-rails-4

每次我再次访问此查询时,都会让我感到困惑,而且我正在寻求更透彻的理解。

我有

class Image < ActiveRecord::Base
  has_many :image_categories, dependent: :destroy
  has_many :categories, through: :image_categories
end

class PagesController
  def portfolio
    @images = Image.all
  end
end

在我看来,我希望显示所有图像,然后将每个类别名称打印为类名

<%= @images.each do |i| %>
  <div id="item-1" class="isotope-item ok-md-3 ok-xsd-12 ok-sd-6 ## class names here">
    <%= image_tag(i.photo.url(:image_square_home)) %>
 </div>
   

3 个答案:

答案 0 :(得分:1)

您想使用以下代码:

<%= i.categories.pluck(:name).join %>

这会将与当前图像关联的每个类别的名称抓取到一个数组中,然后将它们连接成一个由空格分隔的单个字符串。

在实践中,它看起来像这样:

<div id="item-1" class="isotope-item ok-md-3 ok-xsd-12 ok-sd-6 <%= i.categories.pluck(:name).join %>">
    <%= image_tag(i.photo.url(:image_square_home)) %>
</div>

答案 1 :(得分:1)

由于您要为div添加多个类名,请尝试以下方法:

<div id="item-1" class="isotope-item ok-md-3 ok-xsd-12 ok-sd-6 <%= i.categories.pluck(:name) %>">

如果图片没有类别,您可能需要使用try方法:

<%= i.categories.try(:pluck, :name) %>

答案 2 :(得分:1)

您可以在帮助文件中处理此问题(例如PagesHelper),以使您的视图和模型尽可能干净。它可能如下所示:

# app/helpers/pages_helper.rb    
module PagesHelper
  def image_classes(image)
    %w(isotope-item ok-md-3 ok-xsd-12 ok-sd-6) + categories_names(image)    
  end

  private

  def categories_names(image)
    image.categories.pluck(:name)
  end
end

# app/views/pages/portfolio.rb
<%- @images.each do |image| %>    
  <%= div_for image, class: image_classes(image) do |img| %>
    <%= image_tag img.photo.url(:image_square_home) %>
  <%= end %>
<% end %>