Rails中相同模型的不同值

时间:2013-11-25 09:19:04

标签: ruby-on-rails ruby-on-rails-4

我有公司,每家公司都有很多类别 我想跟踪每个公司的类别数量,列表样式,增加/减少添加/删除列表,同时按位置列对它们进行排序。因此,公司内的每个类别都有一个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并决定从头开始编写我自己的方法时遇到了一些困难。那样你也学到了更多,对吧? ;)

3 个答案:

答案 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,而不是使用单独的位置列。除非您希望功能对其类别重新排序,否则这将有效。