需要另一个特定模型的多对多关系

时间:2012-09-16 09:08:56

标签: ruby-on-rails database-design activerecord many-to-many

我通过 Supply 超市产品品牌之间建立了多对多的关系 - 和 Origin -models。 我还想在我的超市里存储我所拥有的特定产品品牌组合。 我想到了另一个模型(我称之为Specific_Combination,我将存储:supermarket_id:product_id:brand_id

class Supermarket < ActiveRecord::Base
  has_many :supplies
  has_many :products, :through => :supplies
end

class Supply < ActiveRecord::Base  
  belongs_to :product  
  belongs_to :supermarket  
end

class Product < ActiveRecord::Base
  has_many :supplies
  has_many :supermarkets, :through => :supplies

  has_many :origins
  has_many :brands, :through => :origins
end

class Origin < ActiveRecord::Base
  belongs_to :products
  belongs_to :brands
end

class Brand < ActiveRecord::Base
  has_many :origins
  has_many :products, :through => :origins
end

现在我认为可以用来存储特定产品品牌组合的课程

class Specific_Combination < ActiveRecord::Base
  # to show which columns I would use:
  attr_accessible :supermarket_id, :product_id, :brand_id
end
  • 这是一种合适的方法吗?
  • 如何对Specific_Combination
  • 之间的关系进行建模
  • 我如何访问(创建...)Specific_Combination中的项目?
  • 更好的方法(规范化)会是什么样的?

修改

class Supply < ActiveRecord::Base  
  belongs_to :origin  
  belongs_to :supermarket  
end

class Product < ActiveRecord::Base
  has_many :origins
end

class Origin < ActiveRecord::Base
  belongs_to :product
  belongs_to :brands
end

class Brand < ActiveRecord::Base
  has_many :origins
end

class Supermarket < ActiveRecord::Base
  has_many :supplies
  has_many :origins, :through => :supplies

  # my attempt to create an array of names of supermarkets
    def self.to_be_chosen
      chosen_supermarket = Array.new
      Supermarket.find_each do |supermarket|
        chosen_supermarket << supermarket.name
      end
    return chosen_supermarket
    end
end

/修改

1 个答案:

答案 0 :(得分:0)

在这里,我可能有供应来源而不是产品。

另外,想想你是否需要SpecificCombination。你打算用它做什么操作?您要列出数据库中的所有SpecificCombinations吗?你打算去寻找一个具体的吗?你打算创建一个新组合吗?

然后想一想这些操作是否只能与其他类一起完成?

class Supermarket < ActiveRecord::Base
  has_many :supplies
  has_many :origins, :through => :supplies

  def self.choice
    Supermarket.all.map { |supermarket| [ supermarket.name, supermarket.id ] }
  end
end

end

class Supply < ActiveRecord::Base  
  belongs_to :origin
  belongs_to :supermarket  
end

class Origin < ActiveRecord::Base
  belongs_to :supplies
  belongs_to :brands
end


walmart = Supermarket.create(:name => "Walmart");

cornflakes = Product.create(:name => "Corn Flakes");
kellogs = Brand.create(:name => "Kellog's");
walmart.origins.create(:product_id => cornflakes, :brand_id = kellogs)