如何在rails中获取关联名称?

时间:2014-05-23 14:01:06

标签: ruby ruby-on-rails-3 callback associations

我的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中获取此关联名称? 任何帮助深表感谢。感谢

2 个答案:

答案 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