tak*_*sot 13 activerecord ruby-on-rails
简短:我有一个外键属性,想知道该外键字段的类(或引用表)是什么.
语境:
给出2个表:users(id, [other fields])和issues(id, user_id, assigned_to, [other fields])
这是我的问题的活跃记录(提取不相关的部分)
class User < ActiveRecord::Base
...
end
class Issue < ActiveRecord::Base
belongs_to :user
belongs_to :assigned_user, :foreign_key => 'assigned_to', :class_name => 'User'
...
end
Run Code Online (Sandbox Code Playgroud)
我想做一个用户可读的更改日志记录.例如,当更改分配的用户时,我希望得到如下消息:Assigned to is changed from Otto to Zoltan.ActiveRecord具有changes一个很好的起点,但它只给我参考ID-s.要翻译成名称,我需要通过id读取用户.
对于关联:user来说,这很容易,因为我必须遵循惯例.但是如何获取assigned_to属性的相同信息(我想制作一般解决方案)?是否有可能弄清楚我们是否有给定属性的关联?我们可以提取该关联的类吗?
ale*_*dev 33
首先,您可以使用reflect_on_association获取所需关联的元数据.然后,从它的结果(它是一个MacroReflection后代)你可以找到这个类:
reflection = Issue.reflect_on_association(:assigned_user)
reflection.class # => ActiveRecord::Reflection::AssociationReflection
reflection.class_name # => 'User'
Run Code Online (Sandbox Code Playgroud)
谢谢。下面是具体问题的最终解决方案(供学习):
def textalize_changes
if changed?
r = ""
changes.keys.each do |k|
r << "#{k.humanize} changed "
r << "from `#{translate(k,changes[k][0])}` "
r << "to `#{translate(k,changes[k][1])}`"
r << "<br/>"
end
r
end
end
def translate(attr_name, attr_value)
ass = self.class.reflect_on_all_associations(:belongs_to).reject{|a| attr_name != a.primary_key_name}
if 1 == ass.length and !attr_value.blank?
obj = ass[0].klass.find(attr_value)
obj.send(:name)
else
attr_value
end
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4220 次 |
| 最近记录: |