2015-02-04 2 views
1

У меня есть отношения has_and_belongs_to_many между категориями и сообщениями. Я создаю область для запроса всех сообщений в определенной категории. Область действия ниже работает, но она выглядит довольно многословной. Есть ли лучший способ, который можно было бы реорганизовать?Настройка областей с привязкой HABTM в Rails

В модели Post:

scope :in_category, ->(category) { joins(:categories).where(categories_posts: {category_id: category.id}) } 

ответ

0

Я не знаю никакого другого пути к этому в Post модели.

Но создать эту область не нужно. Предполагая, что вы уже есть Category экземпляр, это работает:

category.posts 

Edit:

Если вы ищете метод для вызова на Post класса, используйте эту область (но я думаю, что это это изобрести колесо, так как Rails уже предоставляют метод выше):

class Post 
    scope :in_category ->(category) { category.posts } 
end 
+0

Спасибо за ответ! Я знаю, что сборку можно вызвать в другом классе. В этом случае я специально искал метод вызова класса Post. – JeffD23

+0

@ JeffD23, я отредактировал ответ! – Rodrigo

0

Вместо того, чтобы использовать рамки, вы можете использовать метод класса:

class Post < ActiveRecord::Base 
    def self.in_category(category) 
    category.posts 
    end 
end 

Post.in_category(Category.first)

0
def self.in_category(category_id) 
    category_id.blank? ? all : joins(:category_id).where(:categories_posts => {category_id: category_id}) 
end 

Этот подход имеет некоторые преимущества

  • Вы можете позвонить Post.in_category (ID) и получить определенные должности в этой категории, как вы просили.
  • Post.in_category (nil) вернет все сообщения, это полезно, если вы хотите объединить эту область с другими областями.
  • Post.in_category ([ID1, ID2]) будет возвращать сообщения в обеих категориях, идентификатор 1 и id2 (в данном случае было бы неплохо переименовать сферу как in_categories)
Смежные вопросы