【问题标题】:Ruby on Rails named class property of modelRuby on Rails 命名模型的类属性
【发布时间】:2014-08-31 20:34:48
【问题描述】:

我有两个类Productuser,它们与多态类型有has_many 关系。

class User < ActiveRecord::Base
  has_many :pictures, as: :imageable
end

class Product < ActiveRecord::Base
  has_many :pictures, as: :imageable
end

class Picture < ActiveRecord::Base
   belongs_to :imageable, polymorphic: true
end

我还想为profile_picture 的用户模型添加一个新属性,因此@user.profile_picture 将返回一个图片对象。如何做到这一点?特别是向用户添加外键的迁移。

编辑:我已经更新了用户模型

has_one :profile_picture, class_name: "Picture", foreign_key: "profile_picture_id"

并添加了以下迁移

add_column :users, :profile_picture_id, :integer

但是,如果有人能解释我到底做错了什么,我似乎无法设置个人资料图片,我将不胜感激。谢谢!

【问题讨论】:

  • 我查看了该链接,我当前的多态关联来自该链接。我不明白的是如何向用户模型添加新的属性,该属性将是图片类型。
  • has_one :picture, as: :profile_picture
  • 你好。你没有足够接近我的回答:stackoverflow.com/questions/25594975/…
  • 抱歉更新问题更清楚

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


【解决方案1】:
class User < ActiveRecord::Base
  has_many :pictures
  has_one :profile_picture, :class_name => "Picture"
end

class Product < ActiveRecord::Base
  has_many :pictures
end

class Picture < ActiveRecord::Base
   belongs_to :imageable, polymorphic: true
end

【讨论】:

  • 我想知道这应该如何工作。据我所知 - 不应该,没有办法在所有用户的 Pictures 中选择确切的 profile_picture。没有这方面的数据。
  • 我可能误解了这个问题......它写得不是很好......:\如果用户有图片的外键,它应该可以工作
  • 谢谢,我可以看到将新的 has one 属性添加到用户类是如何工作的,但它如何映射到数据库中的用户表。更新的问题希望更清楚
【解决方案2】:

正确使用关联时,没有直接方法可以实现这一点。

数据结构错误。您正试图以两种不同的方式将同一个模型关联起来。而问题是:这两种方式相互干扰

您实际上是在尝试使用相同类型存储不同类型的对象。直接的方法(在另一个答案中建议)会让您无法确定哪些只是User 的图片,哪些是他的profile_picture 其中。所以任何可能的解决方案都需要添加一种方法来区分profile_picture

就在昨天我写了an example on how to use "single table inheritance"。它实际上很适合这里,您需要两个相似的数据结构以不同的方式表现。要使其发挥作用,您需要两件事:

  1. 将 STI 支持添加到 pictures 表:
    rails g migration AddTypeToPictures type:string:index
    ...并确保添加 string 类型的 type 列,并在其上添加索引。

  2. rails g model ProfilePicture --no-migration --parent=Picture
    这个类将被创建为空,但会继承 Picture 的所有内容,因此在许多情况下它应该保持为空。

那么简单的关联应该适用于任何类:

has_one :profile_picture, as: :imageable

假设我们将此添加到User。那么查找User 的头像的搜索条件将是:

  • type"ProfilePicture"
  • imageable_type"User"
  • imageable_id 等于相关用户的id

搜索变得很麻烦,对吧?好吧,这应该可行,但我不推荐所有这些,它有影响和替代方案:

  • 无论您决定将哪个数据库列添加到 ProfilePicture,它都必须添加到 Picture,即使它没有被使用:它们存储在同一个表中。
    解决方案: 使ProfilePicture 成为一个成熟的模型:为它制作一个表格,让它继承ActiveRecord::Base
  • 获取用户的个人资料图片需要使用三个(哇!)不同的标准进行额外的数据库查询。
    解决方案(推荐):将个人资料图片放入相应的模型中与 Picture 一样:这将不需要额外的查询来获取个人资料图片。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多