首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Neo4j.rb如何子类ActiveRel关系?

Neo4j.rb如何子类ActiveRel关系?
EN

Stack Overflow用户
提问于 2017-09-07 13:39:17
回答 2查看 142关注 0票数 0

新手Neo4j.rb (v8.2.1)创业板用户在这里试图找出如何正确处理子类ActiveRel .

我有一个名为HasAccount的关系类型,然后在其他类中进行子类,即OwnsAccount < HasAccount。我在我的模型中定义了如下的关系:

代码语言:javascript
复制
has_many :out, :accounts, rel_class: :HasAccount
has_many :out, :owned_accounts, rel_class: :OwnsAccount
has_many :out, :managed_accounts, rel_class: :ManagesAccount

我的意图是,每当我为节点创建OwnsAccountManagesAccount关系时,它们也可以通过my_node.accounts (即超类‘has_many)访问。

我走错路了吗?我试过每一种方式,避免完全放弃HasAccount,定义一个合并owned_accountsmanaged_accountsaccounts方法.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-07 16:22:43

不幸的是,我不认为子类ActiveRel类会有所帮助(可能您已经发现了;)。

如果您没有ActiveRel类,您可以指定多个类型(我不记得我们是否实现了type: [:OWNS_ACCOUNT, :MANAGES_ACCOUNT],但肯定可以执行type: "OWNS_ACCOUNT|MANAGES_ACCOUNT”’type: false / type: :any)。

如果您需要对您的关系有逻辑,那么您将需要ActiveRel。我认为可以在ActiveRel类上使用ActiveRel,但我不知道在这种情况下如何有单独的owned_accounts / managed_accounts关联(我认为typerel_class是相互排斥的,但这可能是在尝试)。

真的,也许,我们应该考虑到rel_class: [:OwnsAccount, :ManagesAccount],我认为

票数 0
EN

Stack Overflow用户

发布于 2017-09-08 17:52:02

亚当·夏普@adamsharp 07-13:32@快活--一点也不耽搁!<24小时免费产品就是闪电服务!知道答案不是“这是你犯的愚蠢错误”也让我感觉更好。谢谢。是的,我曾希望ActiveRel上的继承会像在ActiveNode上那样,其中子类项在每个级别上都是.all的一部分。在我的项目中,我有一些可以直接处理的例子,但也有一两个地方需要关系中的其他属性和逻辑。

我还考虑了另外两种方法:

( 1)只具有HasAccount,但具有角色属性。但是,我很难找到最简单的方法来为父节点编写私有方法,如下所示:

代码语言:javascript
复制
def owns
  self.accounts.(SOME LOGIC FOR role == 'owner' IN THE REL)
end

也不知道如何改变角色设置后,并想知道性能上分开是否会更好。

2)将所有逻辑重构为中间的ActiveNode类型,即本例中的AccountRole,我可以对其进行子类处理,以便在两个作用域中都包含一个OwnerRole < AccountRole节点。那么我的模型的关键部分是:

代码语言:javascript
复制
class AccountRole
  include Neo4j::ActiveRel

  from_class :User
  to_class   :Account

  def account
    self.to_node
  end
end

class OwnerRole < AccountRole

end

class User

  include Neo4j::ActiveNode
  include Neo4j::Timestamps

  has_many :out, :has_account_roles, rel_class: :AccountRole
  has_many :out, :has_owner_roles, rel_class: :OwnerRole

  def accounts
    self.has_account_roles.map{ |role| role.account }
  end

  def owns
    self. has_owner_role.map{ |role| role.account }
  end

end

现在倾向于第二,但非常热衷于你的选择。

再次感谢!

Brian @cheerfulstoic 9月07 20:29 @adamsharp --实际上,使用类似于self.accounts.rel_where(角色:‘owner)之类的东西做#1应该是相当容易的--那么私有方法仍然会返回一个代表帐户节点的QueryProxy,您可以进一步过滤这些节点,或者将关联从其中删除。您还可以在用all (如self.accounts.rel_where(角色:‘owner))实现的用户上具有相同名称的类方法,这将允许您链接User.all.owns或Something.users.owns等.

亚当·夏普@adamsharp 9月07 21:44太棒了。谢谢你的快乐!会试一试的。更改rel属性的最简单方法是什么?(从业主到经理)?

Brian @activfulstoic9ep 07 21:57如果您有一个ActiveRel对象,您只需说rel.role =‘owner’;rel.save /rel.update(角色:‘owner’)。否则,您将使用Cypher或Ruby,如user.owns(:node,:rel).where(id: account.id).query.set(rel:{role:‘owner’}).exec(很明显,这更详细,但是如果您更新的内容不止一个,那么这个语法就会很有用)

亚当·夏普13:48谢谢你。是的,它试图构造后一种方法,并且通常想出一种干净的方法来访问相关的对象,这些东西把我绑在了一起。会走这条路。谢谢你的帮助!我的整个职业生涯都是个SQL男。这很有趣。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46097892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档