【问题标题】:Rails 3 HABTM - access intersection entityRails 3 HABTM - 访问交叉口实体
【发布时间】:2011-02-01 22:38:23
【问题描述】:

我正在尝试近似 Rails 3 中的多态关系具有多归属关联 (HABTM)。

交集表(user_favorites)有这些字段:user_id, favorite_id, favorite_class

在 User 类中,我定义了关系:

  has_and_belongs_to_many :favorite_users, :class_name => "User", :join_table => "user_favorites", :association_foreign_key => "favorite_id", :foreign_key => "user_id", :conditions => "user_favorites.favorite_class='User'"

对于检索数据,这按预期工作。不幸的是,这个定义不会添加我需要的 favorite_class' 值(在这种情况下是'User')。

有没有办法,也许使用 Arel,在保存记录之前将 favorite_class 字段设置为所需的值?

【问题讨论】:

    标签: ruby-on-rails-3 has-and-belongs-to-many polymorphic-associations arel


    【解决方案1】:

    has_many through 关联可能会更好。这是一篇可能会有所帮助的文章。它解释了多态 has_many :through 关系的问题,并提供了一种解决方法。

    http://blog.hasmanythrough.com/2006/4/3/polymorphic-through

    这也可能有帮助:

    Polymorphic habtm relationships with Rails/ActiveRecord

    【讨论】:

    • +1 habtm 不允许加入关联的额外字段。它经常被视为已弃用,因为在第一次需要额外字段时更改关联(从 habtm 到 hmt)和使用它们的代码会很痛苦。 has_many :through 允许在没有那些主要模块的情况下这样做。
    【解决方案2】:

    我能够通过使用 :insert_sql 选项来解决问题(注意使用单引号):

    :insert_sql => 'INSERT INTO user_favorites (user_id, favorite_id, favorite_type) VALUES (#{id}, #{record.id}, "User")'
    

    【讨论】:

    • 不反对,但我建议不要这样做。 Rails 依赖于遵循约定。像这样进行 sql 插入是一种 PHP 方法,不推荐用于专业生产代码。
    【解决方案3】:

    您的变体中有 SQL 注入。更好地使用以下 UserFavourites 模型:

    before_save :set_favourite_type
    
    private 
    
    def set_favorite_type
      self[:favorite_type] = self.favoritable.class.to_s
    end
    

    或至少使用参数化查询而不是#{}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-08
      • 2022-10-16
      • 1970-01-01
      • 2014-09-17
      • 2020-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多