has_one:through和has_many:通过同一个关联

时间:2014-03-25 19:45:28

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord

我试图用以下约束建模Image模型和Page模型之间的关系:

1 - 一个页面最多可以有一个图像(0图像也可以接受)

2 - 图像可以出现在许多页面中。

所以这种关系可以推测如下:

class Image < ActiveRecord :: Base
  has_many :pages, :through :imageables
end

class Page < ActiveRecord :: Base
  has_one :image, :through :imageables
end

class Imageable < ActiveRecord :: Base
  belongs_to :image
  belongs_to :page
end

通常这种关联既存在于具有has_many的两个类Image和具有has_many的两个类中:或者两者都具有has_one:through 在这种情况下,是否可以在has_one:through和has_many:之间进行混合? ActiveRecord没有提到这个特殊情况

P.S:我选择使用连接模型方式,因为我有其他模型可以拥有相同的图像以及不同的约束(has_many而不是has_one)

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

上面的代码没有用......我找到了一个实现我需要的架构的中间解决方案。

最终代码如下:

class Image < ActiveRecord :: Base
  has_many :pages, :through :imageables
end

class Page < ActiveRecord :: Base
  has_many :image, :through :imageables
  accepts_nested_attributes :images, allow_destroy => true
end

class Imageable < ActiveRecord :: Base
  belongs_to :image
  belongs_to :page
  validates_uniqueness_of :page_id
end

当我使用rails_admin编辑我的模型时,我得到的就是添加新图像和Imageable中的验证确保ditor不会乱用规范......

作为解决方案有点奇怪,但请相信我,它很适合我正在开发的应用程序的上下文......

如果有人有类似的担忧,我会张贴它。