Ruby on rails Rails通过过滤关联有很多

Ruby on rails Rails通过过滤关联有很多,ruby-on-rails,ruby-on-rails-3,associations,Ruby On Rails,Ruby On Rails 3,Associations,我试图使用一个连接模型来表示两个独立但非常相似的关联。以下是我所拥有的: 两种主要型号:包装、尺寸 包装有很多尺寸,但有褶皱。需要将大小分配为顶部或底部的大小。我目前在软件包上的关联是: has_many :package_sizes has_many :sizes, :through => :package_sizes has_many :bottoms_sizes, :through => :package_sizes, :scope => {:package_sizes

我试图使用一个连接模型来表示两个独立但非常相似的关联。以下是我所拥有的:

两种主要型号:包装、尺寸

包装有很多尺寸,但有褶皱。需要将大小分配为顶部或底部的大小。我目前在软件包上的关联是:

has_many :package_sizes
has_many :sizes, :through => :package_sizes
has_many :bottoms_sizes, :through => :package_sizes, :scope => {:package_sizes => {:bodylocation => "B"}}, :source => :size
has_many :tops_sizes, :through => :package_sizes, :scope => {:package_sizes => {:bodylocation => "T"}}, :source => :size
PackageSize是一个连接模型,具有:size_id | package_id | bodylocation:string

我有一个失败的测试来验证它是否正常工作:

@p = Package.new
@size1 = Size.first
@p.tops_sizes << @size1
@p.save
@p.reload
@p.tops_sizes.should include(@size1)
@p=Package.new
@size1=第一个尺寸

@p、 tops_size尝试为此创建两个单独的关联

has_many :bottom_package_sizes, :class_name => 'PackageSize', :conditions => {:bodylocation => 'B'}
has_many :top_package_sizes, :class_name => 'PackageSize', :conditions => {:bodylocation => 'T'}
has_many :bottom_sizes, :through => :bottom_package_sizes
has_many :top_sizes, :through => :top_package_sizes
在以下问题的答案中有一个更好的解决方案:

基本上是这样的:

has_many :package_sizes
has_many :sizes, :through => :package_sizes do
  def tops
    where("package_sizes.bodylocation = 'T'")
  end
  def bottoms
    where("package_sizes.bodylocation = 'B'")
  end
end
然后,您将查询它们,如:

@p.sizes.tops

令人惊叹的。效果很好。谢谢