Это эффективно? - PullRequest
       10

Это эффективно?

2 голосов
/ 24 июня 2011

Не могли бы вы сказать мне, если есть лучший способ.

Модели:

class Skill
  has_many :tags
  has_many :positions
end


class Tag
  belongs_to :skill
  has_and_belongs_to_many :positions
end


class Position
  belongs_to :skill
  has_and_belongs_to_many :tags
end

Я хочу перечислить все навыки и теги их позиций.Примерно так:

skill - tag tag tag tag
skill - tag tag
...

Мне удалось добиться этого примерно так:

<% @skills.each do |skill| %>
  <%= skill.name %>   
  <% skill.positions.collect{|p| p.tags}.flatten.uniq.each do |t| %>
    <%= t.name %>
  <% end %>   
<% end %>

И мой управляющий навыком:

def index
  @skills = Skill.all
end

Это правильный путь?

Ответы [ 2 ]

1 голос
/ 24 июня 2011

Поскольку тегирование является довольно распространенной проблемой, я рекомендую взглянуть на actions-as-taggable-on , широко используемый и очень хороший драгоценный камень для добавления тегов в любую модель Rails.

Несмотря на это, ваши модели выглядят довольно хорошо (за исключением того, что has_and_belongs_to_many часто избегают в пользу has_many :through), но я вижу здесь возможности для улучшения:

<% skill.positions.collect{|p| p.tags}.flatten.uniq.each do |t| %>
  <%= t.name %>
<% end %>  

Во-первых, этомного бизнес-логики, чтобы поставить на ваш взгляд.Вы должны сделать это в вашем контроллере вместо этого.Во-вторых, было бы более эффективным сделать это наоборот:

@tags = Tag.all :conditions => [ "tag.id IN (?)", skill.positions.map &:id ]

Есть еще более эффективные способы сделать это, но это должно дать вам представление.

0 голосов
/ 24 июня 2011

Прежде всего - с любым вопросом производительности вы должны измерить производительность.Создайте вдвое больше умений, тегов и позиций, сколько вы ожидаете в рейк-задании.Затем измерьте время загрузки страницы.Если они в порядке для ваших нужд, круто.В противном случае продолжайте чтение.

Это не особенно эффективно, поскольку вы будете переходить через сеть к базе данных для каждого умения для сопоставления позиций, а затем снова для каждой позиции сопоставления тегов.Вы можете использовать метод include для загрузки с использованием меньшего количества запросов - см. Руководство Rails по запросам .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...