2010-09-05 2 views
9

Мы планируем обновить наше приложение до Rails3. Один плагин, который мы использовали довольно много, - nested_has_many_through. Этот плагин кажется устаревшим и больше не поддерживается и просто не работает в новом приложении Rails3.Rails3 вложенные has_many через вопрос

Простой пример:

Author.rb 
has_many :posts 
has_many :categories, :through => :posts, :uniq => true 
has_many :related_posts, :through => :categories 

Post.rb 
belongs_to :author 
belongs_to :category 

Category.rb 
has_many :posts 

Можно ли рекомендовать лучший практике способ справиться с этим, или рабочий Rails3 плагин?

Спасибо!

+1

Ха-ха, я только что нашел свою вилку http://github.com/releod/nested_has_many_thr и вспомнил этот вопрос и пришел сюда, чтобы рассказать вам все о вилке. И затем я увидел ваше имя пользователя. Хорошая работа, я просто протестировал это в своем приложении Rails 3 и работает (в основном). Я проводил всю ночь, пытаясь исправить Rails прямо в соответствии с https://rails.lighthouseapp.com/projects/8994/tickets/1152-support-for-nested-has_many-through-associations, но застрял. Я начну с вашей вилки в качестве шаблона, и теперь я могу продолжить! –

+0

+1 http://github.com/releod/nested_has_many_through for rails3 fork работает для меня тоже, будет использовать его до рельсов 3.1 – clyfe

ответ

0

Я больше смущен частью has_many: related_posts. Вы пытаетесь существенно объединить категоризированные сообщения? Например, все должности категории «х» считаются «связанными»? Если да, то это не будет работать на основе не есть класс RelatedPost, так, чтобы исправить это, как минимум, вы должны указать: class_name на ассоциации:

has_many :related_posts, :class_name => 'Post', :through => :categories 

Но, во-вторых, это, вероятно, не правильный подход для начала. Поскольку у любого автора уже есть сообщения__пользователя через внешний ключ author_id, нет смысла пытаться переплетаться через таблицу категорий, вместо этого использовать логику группировки.

Альтернативные подходы, которые приберёмся:

Author.rb

has_many :posts do 
    def related 
    all.group_by(&:category_id) 
    end 
end 
author.posts.related 
=> OrderedHash 

Конечно, все это спорно, если это не то, что вы пытаетесь достичь. : P

+2

Я склонен думать, что его пример надуман (отсюда легко ошибочно). Его вопрос по-прежнему принципиально важен. И, насколько мне известно, НЕ работает рабочее решение для вложенных имеет много сквозных путей в Rails 3 (a la the old nested_has_many_through для Rails <2.3) –

+0

В последней части его вопроса упоминается «рекомендация лучшей практики». Я хотел сказать, что если ваше приложение требует этого, вероятно, есть лучший механизм для его достижения. ;) Если его пример действительно надуман, было бы невероятно полезно увидеть его фактический код. – jenjenut233

+1

Достаточно честный. Существуют определенные случаи, когда вложенное имеет много ассоциаций (т. Е. Использование нескольких INNER JOINs для не-Rails folk) является допустимым решением, а часто и лучшим. Учитывая, что «автор - <статьи - <подписчики> - подписчики> - <интересы», «автор. Подписчики» и «автор. Подписчики» - оба будут кандидатами на использование вложенных, на мой взгляд, много. Другой вариант - кэшировать эти ассоциации при изменении ассоциаций 1-го уровня, что является менее идеальным. –

0

Rails 3 (непроверенные, заказы на посты с большинством смежных категорий первым):

category.rb:

class Category < ActiveRecord::Base 
    class << self 
    def posts 
     Post.joins(:categories). 
      where(:categories => select('id').all.map(&:id)). 
      group('posts.id'). 
      order('count(*) DESC') 
    end 
    end 
end 

Использование:

related_posts = author.categories.posts 
Смежные вопросы