【问题标题】:Generate ActiveRecord includes hash from string生成 ActiveRecord 包括来自字符串的哈希
【发布时间】:2017-12-21 16:49:22
【问题描述】:

我有这样的架构:

userhas_many post_valuesbelongs_to authorhas_many addresses

class User < ActiveRecord::Base
  has_many :post_values
end

class PostValue < ActiveRecord::Base
  belongs_to :user
  belongs_to :author
end

class Author < ActiveRecord::Base
  has_many :post_values
  has_many :addresses
end

class Address < ActiveRecord::Base
  belongs_to :author
end

此架构只是一个示例,并不反映真实案例。

现在我有一个这样的字符串:post_values_author_addresses。

Rails 库中存在一个库或一个 gem 或一个方法,给定该字符串返回关联哈希:{post_values: {author: :addresses}}?

我知道 Ransack 的作用域类似......

我需要这样的方法:

User.get_associations(:post_values_author_addresses) => {post_values: {author: :addresses}}

我希望我是清楚的......

【问题讨论】:

  • 这对我来说没有意义不应该是 {user: [:post_values,:author, :addresses]} 因为现在看起来你想要的哈希意味着 User has_many :post_values 和 PostValue belongs_to :author 和 Author has_many :addresses。是您的架构吗?这个问题非常不清楚。当我读到它时,它读作User has_many :post_values 和User belongs_to :author 和User has_many :addresses。您还可以解释为什么这在功能上是必要的,它可能会帮助我们为您解决它
  • @engineersmnky 编辑了问题...
  • 这需要一些解析逻辑。你能控制你得到的字符串(比如post_values_author_addresses)吗?你能把它改成post_values__author__addresses吗?这样每个双下划线都被认为是关系名称的分隔符。此外,正如@engineersmnky 的评论所暗示的那样,如果您想要“同一级别”的多个关联,例如post_values: {:user, author: :addresses},这种解析将很困难。您将如何编写匹配这些关联哈希的字符串?
  • 字符串应该只有一个下划线。
  • @Pioz 链接名称重叠时会发生什么?比如说User has_one :plan 和User has_many :plan_fields 和Plan has_many :fields 那么像:plan_fields 这样的东西会发生什么,应该是:plan_fields 或{plan: :fields} 这种用法看起来很脆弱,我们仍然没有可行的用例示例

标签: ruby-on-rails ruby activerecord


【解决方案1】:

我会考虑将“has_one_through...”关联添加到 PostValue 类。

has_many :addresses, :through => :author

Addresses 则相反

has_many :PostValues, :through => :author

您可能需要 inverse_of 选项将事物联系在一起,但如果您的命名是传统的,您可能会很好。

这个页面描述了它的使用:http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association

然后您也许可以使用PostValue.reflect_on_all_associations 来查找与您的字符串匹配的关联。我没有尝试过:through 关联,但很有可能您会在 name 属性中找到所需的内容。比如:

PostValue.reflect_on_all_associations.select {|a| a.name == my_string} 

免责声明:我曾独立使用过这些东西,但从未一起尝试过。因此,如果它不起作用,请告诉我,我可以尝试适当地更新我的答案。

【讨论】:

    猜你喜欢
    • 2012-10-10
    • 2012-03-07
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 2011-04-01
    相关资源
    最近更新 更多