【问题标题】:Rails append type to join table with has_many :through and association extensionsRails 将类型附加到带有 has_many 的连接表中:通过和关联扩展
【发布时间】:2012-11-08 01:07:11
【问题描述】:

我与 Rails 中的扩展有一个 AR 关联,类似于此链接中提供的示例: ActiveRecord Association Extensions

has_many :issues, :through => :qbert_issues do
  def tracking
    where("qbert_issues.kind = ?", "tracking")
  end

  def blocking
    where("qbert_issues.kind = ?", "blocking")
  end
end

如上所示,我的是多类型的...我需要在我的连接表中填充一个“种类”列。理想情况下,这应该可以工作:

q = QBert.find(123)
q.issues.tracking << Issue.find(234)

因此,文章建议重载&lt;&lt; 并执行以下操作:

has_many :issues, ... do
  ...
  def <<(issue)
    issue.kind = "UserAccount"
    proxy_association.owner.issues += [issue]
  end
end

如果 kind 是静态的,那就太好了。

看来我可以做到……

has_many :issues, ... do
  ...
  def <<(*args)
    issue, kind = args.flatten
    issue.kind = kind
    proxy_association.owner.issues += [issue]
  end
end

这至少可以让我这样做:

q = QBert.find(123)
q.issues.tracking << [Issue.find(234), :tracking]

这对我来说似乎不是很干燥......有更好的方法吗?如果您考虑到 kind 访问器不在连接表 qbert_issues 上,则可以加分。我猜我只需要直接通过QBertIssue 模型手动添加关联。

【问题讨论】:

  • 我找到了我正在寻找的答案,但我也在寻找替代技术。我将移动复选标记以获得更好的实施。

标签: ruby ruby-on-rails-3 activerecord associations


【解决方案1】:

想通了……

def <<(issue)
  kind = where_values.second.scan(/kind = '(.*)'/).flatten.first
  left = proxy_association.reflection.source_reflection
  right = proxy_association.reflection.through_reflection

  left.active_record.create(left.foreign_key.to_sym => issue.id, 
                            right.foreign_key.to_sym => proxy_association.owner.id, 
                            :kind => kind)
end

这让我可以这样做:

q = QBert.find(123)
q.issues.tracking << Issue.find(234)

通过解析where_values并将它们合并到参数哈希中,可以使其充分泛化。

Pry 岩石,顺便说一句:D

【讨论】:

  • 您对如何获得此解决方案有任何参考资料吗?
  • 我通过在 Pry 会话中打高尔夫球时翻阅文档和其他一些 Rails 网站找到了答案。如果我有一个链接可以引导我找到解决方案,我已经忘记了:D
  • 感谢您的回复!我找到了一些解决方案(实际上它们很简单),所以如果我有任何更新,我会告诉你
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
  • 2016-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-26
相关资源
最近更新 更多