Rails中的一对多关系

时间:2012-03-05 19:17:14

标签: ruby-on-rails

我很难设置数据库的基本结构。

我有产品(约50个)。每个产品都与一个或更多位置相关。

基本架构将是这个(暂无关系)

产品

id:integer
name:string

地点

id:integer
name:string
content:string

我首先想通过将place_id添加到产品和控制器中的has_many belong_to来连接地点和产品,但由于产品可能有多个地方,我不知道如何。

3 个答案:

答案 0 :(得分:1)

只需通过连接使用

ProductsPlaces(新表)

product_id
place_id

在模特中

class Product < ActiveRecord::Base
  has_many :places, :through => :products_places
end

class Place < ActiveRecord::Base
  has_many :products, :through => :products_places
end

还有has_and_belongs_to_many,实际上相同(使用ProductsPlaces表)

class Product < ActiveRecord::Base
  has_and_belongs_to_many :places
end

class Place < ActiveRecord::Base
   has_and_belongs_to_many :products
end

但最好使用,因为has_and_belongs_to_many将被弃用。

答案 1 :(得分:1)

如果产品有多个地方和一个地方has_many产品,那么您的协会需要多对多。

在Rails中有两种方法可以做到这一点,最推荐的是连接模型。您明确标记了产品和地点之间的关系。您可以将其称为ProductLocation或Shop或类似产品,它看起来像这样:

product_locations:
  product_id
  place_id

class ProductLocation < ActiveRecord::Base
  belongs_to :product
  belongs_to :place
end

class Place < ActiveRecord::Base
  has_many :product_locations
  has_many :products, :through => :product_locations
end

class Product < ActiveRecord::Base
  has_many :product_locations
  has_many :places, :through => :product_locations
end

请参阅http://guides.rubyonrails.org/association_basics.html#choosing-between-has_many-through-and-has_and_belongs_to_many

答案 2 :(得分:0)

听起来您想将product_id添加到places

产品has_many位置

放置belongs_to产品