我有公司,每家公司都有很多类别 我想跟踪每个公司的类别数量,列表样式,增加/减少添加/删除列表,同时按位置列对它们进行排序。因此,公司内的每个类别都有一个Position属性。
|pos| name
1 - cat1
2 - cat2
3 - cat3
因此,当我创建公司时,我已经有2个默认类别(在创建之前等),而在我的Category类中,我有:
@@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:在我使用acts_as_list gem之前,它工作得很好,但是当我切换到Postgres并决定从头开始编写我自己的方法时遇到了一些困难。那样你也学到了更多,对吧? ;)
答案 0 :(得分: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
这不适合你的情况吗?
答案 1 :(得分:0)
听起来你正在寻找counter cache
:
http://railscasts.com/episodes/23-counter-cache-column
请阅读http://guides.rubyonrails.org/association_basics.html#belongs-to-association-reference
的第4.1.2.3节基本上,counter cache
会跟踪关联中存在的子项数。每次创建或删除一个缓存时,都会更改缓存以反映该缓存。
答案 2 :(得分:0)
说,你有一个带有属性的模型CompanyCategories:
id,company_id,category_id
您可以按递增顺序使用id-attribute,而不是使用单独的位置列。除非您希望功能对其类别重新排序,否则这将有效。