2013-11-25 8 views
0

У меня есть компании, и у каждой компании много категорий. Я хотел бы отслеживать количество категорий каждой компании, стиль списка и увеличивать/уменьшать список при добавлении/удалите, сортируя их по столбцу позиции. Поэтому каждая категория внутри Компании имеет атрибут Position.Различные значения для одной и той же модели в Rails

|pos| name 
    1 - cat1 
    2 - cat2 
    3 - cat3 

Так что, когда я создаю компанию у меня уже есть 2 категории по умолчанию (до создания и т.д.), и в моей категории классе у меня есть:

@@total_positions = 2 

Для манипулирования позиции на категории создаю я использую:

before_create :add_position_to_new 
    before_destroy :decrement_positions 

def add_position_to_new 
    self.position = @@total_positions + 1 
    @@total_positions = self.position 
end 

def decrement_positions 
    @@total_positions = @@total_positions - 1 
end 

Это все работает нормально, но все мои категории в приложении имеют общий счетчик позиций. Я хотел бы, чтобы каждая компания имела свой собственный счетчик @@ total_position для своих категорий. Пожалуйста, укажи меня в правильном направлении.

PS: до того, как я использовал gem action_as_list, и он отлично работал, но затем я столкнулся с некоторыми трудностями при переключении на Postgres и решил написать свой собственный метод с нуля. Таким образом, вы также узнаете немного больше, не так ли? ;)

ответ

1

Если я правильно понимаю вашу проблему, вы можете отслеживать количество категорий и/или компаний через отношения «многие ко многим».

Учитывая следующее:

class Category < ActiveRecord::Base 
    has_and_belongs_to_many :companies 
end 

class Company < ActiveRecord::Base 
    has_and_belongs_to_many :categories 
end 

Затем вы можете использовать size на какой-либо ассоциации (т.е. компаний и категории) для определения количества связанных объектов следующим образом:

company = # a company ... 
# returns the number of categories for the company 
company.categories.size 

category = # a category ... 
# returns the number of companies for the category 
category.companies.size 

Не будет ли это работать в вашем случае?

+0

Удивительно, спасибо! –

0

Похоже, вы ищете counter cache:

http://railscasts.com/episodes/23-counter-cache-column

Подробнее в разделе 4.1.2.3 из http://guides.rubyonrails.org/association_basics.html#belongs-to-association-reference

по существу, counter cache следит за количеством детей, существуют для ассоциации. Каждый раз, когда он создается или удаляется, кеш изменяется, чтобы отразить это.

+0

Благодарим за то, что вы указали мне правильное направление! Быстрый вопрос, хотя - этот столбец хранит номера позиций на каждый отдельный элемент (1,2,3,4, n) или сохраняет общую сумму этих предметов? Проблема в том, что мне нужно сортировать свои категории в зависимости от их атрибута позиции. –

+0

А, на самом деле это не так ясно. На самом деле я до сих пор не совсем понимаю, что вы имеете в виду ...? Попробуйте обновить свой вопрос, чтобы сделать это требование более четким. – Matt

0

Скажем, у вас есть модель CompanyCategories с атрибутами:

идентификатор, company_id, category_id

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

Смежные вопросы