如何在 rails 上的 ruby 中创建类似于 has_many 的休眠关联?
How to create hibernate like has_many association in ruby on rails?
我正在 rails 应用程序上开发一个 ruby,我需要使用 grails 应用程序开发的现有数据库。在那个 grail 应用程序中,他们使用 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(没有模型)中实现休眠has_many关联有什么解决方案吗?
注意:我没有将 "B" 模型用于任何单独的操作。
提前致谢。
简而言之 - 不。 那不是 Rails 和 ActiveRecord 的工作方式。在 ActiveRecord 中,每个模型都对应一个数据库 table。
在 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.
一般来说,模型是 Rails MVC 风格中最重要的部分,所以我真的看不出绕过它们有什么具体好处。
如果你想在一个记录数据上存储一堆辅助数据,几个RDBMS系统有ARRAY、HSTORE和JSON等数据类型。但是,就 AR 而言,这些被视为单个列,而不是 has_many
关系。
然而,在这种情况下,您可以使用遗留数据库——但这并不意味着您的对象关系映射需要与 Hibernate 相匹配。这只是意味着您需要做更多的配置来告诉 ActiveRecord 您如何建模映射到架构和外键等。
但是,除非您需要 rails 与遗留应用程序共享数据库,否则迁移数据库通常更明智,以便它遵循 rails 约定。
如果您的应用程序仅共享身份验证,则设置两个应用程序都使用的 OAuth 身份验证提供程序可能更有意义。
我正在 rails 应用程序上开发一个 ruby,我需要使用 grails 应用程序开发的现有数据库。在那个 grail 应用程序中,他们使用 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(没有模型)中实现休眠has_many关联有什么解决方案吗?
注意:我没有将 "B" 模型用于任何单独的操作。
提前致谢。
简而言之 - 不。 那不是 Rails 和 ActiveRecord 的工作方式。在 ActiveRecord 中,每个模型都对应一个数据库 table。
在 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.
一般来说,模型是 Rails MVC 风格中最重要的部分,所以我真的看不出绕过它们有什么具体好处。
如果你想在一个记录数据上存储一堆辅助数据,几个RDBMS系统有ARRAY、HSTORE和JSON等数据类型。但是,就 AR 而言,这些被视为单个列,而不是 has_many
关系。
然而,在这种情况下,您可以使用遗留数据库——但这并不意味着您的对象关系映射需要与 Hibernate 相匹配。这只是意味着您需要做更多的配置来告诉 ActiveRecord 您如何建模映射到架构和外键等。
但是,除非您需要 rails 与遗留应用程序共享数据库,否则迁移数据库通常更明智,以便它遵循 rails 约定。
如果您的应用程序仅共享身份验证,则设置两个应用程序都使用的 OAuth 身份验证提供程序可能更有意义。