【发布时间】: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)
因此,文章建议重载<< 并执行以下操作:
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