【问题标题】:How to create hibernate like has_many association in ruby on rails?如何在 ruby​​ on rails 中创建类似 has_many 关联的休眠?
【发布时间】:2016-02-01 06:19:32
【问题描述】:

我正在开发一个 ruby​​ on rails 应用程序,我需要使用由 grails 应用程序开发的现有数据库。在那个圣杯应用程序中,他们使用的是 spring security oauth2 库。

我了解到 Spring 库使用的是休眠 ORM,而我的 Rails 应用程序使用的是 ActiveRecord ORM。在hibernate has_many关联如下:

class OAuthClient {

    private static final String NO_CLIENT_SECRET = ''

    transient springSecurityService

    String clientId
    String clientSecret

    Integer accessTokenValiditySeconds
    Integer refreshTokenValiditySeconds

    Map<String, Object> additionalInformation

    static hasMany = [
            authorities: String,
            authorizedGrantTypes: String,
            resourceIds: String,
            scopes: String,
            redirectUris: String
    ]

}

在上面的示例中,has_many 声明将创建没有任何域模型的关联表。

但在 Rails 中,我们需要创建两个模型,例如:

class A < ActiveRecord::Base
  has_many :bs,
end

class B< ActiveRecord::Base
  belongs_to :a
end

有没有办法在Rails中实现hibernate has_many关联(无模型)?

注意:我没有将“B”模型用于任何单独的操作。

提前致谢。

【问题讨论】:

    标签: ruby-on-rails hibernate grails activerecord has-many


    【解决方案1】:

    简而言之 - 不。 Rails 和 ActiveRecord 不是这样工作的。在 ActiveRecord 中,您有模型,每个模型对应一个数据库表。

    在 ActiveRecord 中,模型之间存在关系——这就是 AR 知道如何加入以及如何处理从数据库中提取的数据的方式。与 hibernate 不同,AR 中的关系不仅仅是一个数组 - 而是延迟加载的范围,AR 需要连接模型来启用对关系的反射。

    a = thing.accessories # a lazy loading scope
    a = a.where(color: 'Blue') # adds a condition to the scope
    a.to_a # fetches from the DB. 
    

    一般来说,模型是 MVC 的 Rails 风格中最重要的部分,所以我并没有真正看到绕过它们有什么特别的好处。

    如果你想在一个记录数据上存储一堆辅助数据,那么几个 RDBMS 系统都有 ARRAY、HSTORE 和 JSON 等数据类型。然而,就 AR 而言,这些被视为单个列,而不是 has_many 关系。

    但是在这种情况下,您可以使用旧数据库——但这并不意味着您的对象关系映射需要与 Hibernate 匹配。这只是意味着你需要做更多的配置来告诉 ActiveRecord 你的模型如何映射到模式和外键等。

    但是,除非您需要 Rails 与旧版应用程序共享数据库,否则迁移数据库通常会更加明智,以使其遵循 Rails 约定。

    如果您的应用程序仅共享身份验证,则设置两个应用程序都使用的 OAuth 身份验证提供程序可能更有意义。

    【讨论】:

    • 嗨 Max 谢谢你的回复。
    猜你喜欢
    • 1970-01-01
    • 2016-04-14
    • 2011-01-13
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多