【问题标题】:Rails association铁路协会
【发布时间】:2013-09-03 23:01:42
【问题描述】:

我在多态关联方面遇到了麻烦,此时我不知道是否应该使用此关联来完成我想要完成的任务:

我有三个模型:PostProjectPhoto

我希望能够将Photo 记录与PostProject 记录相关联。如果我有一个与Project 关联的Photo,然后我尝试将它与Post 关联,它会从那个Poject 中消失,但成功地附加到那个Post

我应该这样做吗:

Post
has_one :photo

Project 
has_one :photo

Photo
belongs_to :post
belongs_to :project

【问题讨论】:

    标签: ruby-on-rails activerecord associations polymorphic-associations


    【解决方案1】:

    您所描述的不是常规的多态关联(它允许动态关联的父级,但只有一个)。 您似乎需要一对多的多态关联,或者只是在照片模型上同时拥有project_idpost_id

    我相信后一种选择更好,除非您绝对知道您需要将照片与 更多 个模型相关联。

    如果您仍然想使用 many_polymorphic 方法:这是一个很好的例子 Setting up a polymorphic has_many :through relationship

    【讨论】:

    • 谢谢!我采用了简单的解决方案(照片模型上的 ID)。
    【解决方案2】:

    如果您想同时将照片与帖子和项目相关联,您可以这样声明关系:

    Post
      has_one :photo
    
    Project 
      has_one :photo
    
    Photo
      belongs_to :post
      belongs_to :project
    

    您需要添加的是:dependent => :nullify,它将此已删除对象(项目或帖子)的关联记录外键值更新为NULL,因此您的has_one :photo 变为:

     Post
      has_one :photo, :dependent => :nullify
    
     Project 
      has_one :photo, :dependent => :nullify
    

    记住您的 photos 表需要引用您的项目和帖子的 post_idproject_id 属性。

    为了完整起见,如果您想在您的帖子/项目被销毁时销毁照片,请使用 :dependent => :destroy,如果您不添加任何仍然引用的外键,这根本不是一个好主意。

    有关 has_one 关联检查文档的更多详细信息:http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_one

    希望对你有帮助

    【讨论】:

    • 帮助很大!谢谢
    【解决方案3】:
    class Post
      has_one :photo, as: :photoable
    end
    
    class Project
      has_one :photo, as: :photoable
    end
    
    class Photo
      belongs_to :photoable, polymorphic: true
    end
    

    http://guides.rubyonrails.org/association_basics.html(查看第 2.9 节关于多态关联的内容)

    【讨论】:

    • 谢谢阿廷。这就是我所拥有的。问题是,当我将照片与帖子和项目相关联时,它会从最初与之关联的任何内容中删除。因此,如果一张照片与一个项目相关联,然后我想将它与一个帖子相关联,它就会从项目中删除。
    • 看起来多态是使用错误的关联。照片记录上有 photoable_type: "Post",因此它不能同时与 Post 和 Photo 关联
    • 我现在看到了您的问题。只是出于好奇,如果您执行以下操作: photo = Photo.last (假设这张照片通过多态关系属于一个项目 - photoable_type: "Project")。你加载了一个帖子,post = Post.last。如果你做了 new_photo = post.new_photo(url: photo.url) (我不知道照片有什么属性,所以我只是在编造 url)。它会简单地将我们从数据库中提取的照片重新分配给帖子吗?
    猜你喜欢
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多