gpt4 book ai didi

ruby - Rails 附加类型以使用 has_many :through and association extensions 连接表

转载 作者:太空宇宙 更新时间:2023-11-03 16:32:36 25 4
gpt4 key购买 nike

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

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

最佳答案

想通了...

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

关于ruby - Rails 附加类型以使用 has_many :through and association extensions 连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13280949/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com