扩展Rails has_many关联(替换finder_sql)

时间:2016-08-10 09:41:47

标签: ruby-on-rails-4 associations

如何通过我自己的方法扩展我的has_many关联,该方法“返回所有关联对象的数组”?具体来说,我的另一个模型有两个反向引用(src_record_id和dst_record_id)到主模型,我想要所有相关记录,其中反向引用指向我的主模型。以下不起作用:

class CfrRecord < ActiveRecord::Base
  has_many :cfr_relations, foreign_key: :src_record_id, class_name: 'CfrRelation' do
    def cfr_relations
      CfrRelations.where('src_record_id = :id OR dst_record_id = :id', id: "#{ self.id }")
    end
  end
  ...
end

当我运行此代码时,它仍然使用标准的生成查询:

SELECT * FROM cfr_relations WHERE src_record_id = 17

但我希望看到:

SELECT * FROM cfr_relations WHERE src_record_id = 17 OR dst_record_id = 17

我想,我试图覆盖getter方法 - 根据其他帖子 - 可能不是一个好主意。可能Rails关联框架无法支持我的问题。似乎我需要声明两个关联并从那里开始。

更新

我通过定义两个关联和一个方法解决了这个问题:

class CfrRecord < ActiveRecord::Base
  has_many :src_relations, foreign_key: :src_record_id, class_name: 'CfrRelation'
  has_many :dst_relations, foreign_key: :dst_record_id, class_name: 'CfrRelation'
  accepts_nested_attributes_for :src_relations, :dst_relations

  def cfr_relations
    CfrRelations.where( 'src_record_id = :id OR dst_record_id = :id', id: "#{ self.id }")
  end

...
end

这正确地提供了两个单独的关联以及一个在需要时为两个关联获取记录的方法(例如,对于索引视图)。在创建或更新记录时,我需要以不同的方式处理关联。

0 个答案:

没有答案