我的user.rb模型文件中有以下关联代码
class User < ActiveRecord::Base
has_many :sent_messages, class_name: 'ChatMessage', foreign_key: 'sender_id'
has_many :received_messages, class_name: 'ChatMessage', foreign_key: 'receiver_id'
end
我想在ChatMessage模型中使用一个方法,该方法应由以下
触发current_user.sent_messages
current_user.received_messages
该方法应返回被调用的关联的名称。 例如:
class ChatMessage < ActiveRecord::Base
after_find :get_association_name
def get_association_name
self.association_name // this should return sent_message or received_message depending on whether current_user.sent_messages or current_user.received_messages was called
end
end
有没有办法在rails中获取此关联名称? 任何帮助深表感谢。感谢
答案 0 :(得分:1)
我不确定,正是您要找的,但是
CurrentUser.reflect_on_all_associations(:has_many)
将给出所有has_many关联的数组。
答案 1 :(得分:0)
我还没有对此类案件使用AR关联扩展,但您应该可以这样做:
has_many :sent_messages, class_name: 'ChatMessage', foreign_key: 'sender_id' do
def get_association_name; 'sent_messages'; end
# or, to make this more generic,
# def get_association_name; proxy_association.reflection.name.to_s; end
end
该方法应该可以从您的关系中访问。如果您使用的是Rails 4,则可以将通用版本提取到单独的模块中,以更简洁地扩展您的关联。请参阅http://guides.rubyonrails.org/association_basics.html#association-extensions。
修改强>
尝试:
has_many :sent_messages, class_name: 'ChatMessage', foreign_key: 'sender_id' do
def and_set_type
proxy_association.target.each do |msg|
msg.update_attribute(:type, 'sent')
end
scoped
end
end
然后使用sent_messages
访问您的current_user.sent_messages.and_set_type
。