2

我与 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)

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

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直接通过模型手动添加关联。

4

1 回答 1

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

于 2012-11-08T02:37:41.153 回答