ruby-on-rails – 使用两个外键设置范围

我有以下模式:

我想要选择为foreign_keys(author_id和editor_id)以及单独的一个(例如author_proposals和editor_proposals)调用投标,我需要选择懒惰或加载它们(例如User.includes(:提案)或没有连接).

更新:

#I have the scopes which is like this:
class User < ActiveRecord::Base
  has_many :author_proposals,class_name: 'Proposal',foreign_key: :author_id
  has_many :editor_proposals,foreign_key: :editor_id
end

class Proposal < ActiveRecord::Base
  belongs_to :author,class_name: 'User',foreign_key: :author_id
  belongs_to :editor,foreign_key: :editor_id
end

但我需要一个通用的,它将给我所有的建议(author_proposals和editor_proposals),它也将加载它们.我应该在has_many上使用条件吗?

解决方法

你可以这样做:
class User < ActiveRecord::Base
  has_many :authored_proposals,foreign_key: :author_id
  has_many :editored_proposals,foreign_key: :editor_id

  def proposals
    authored_proposals | editored_proposals
  end
end

class Proposal < ActiveRecord::Base
  belongs_to :author,foreign_key: :editor_id

  def users
    author | editor
  end
end

您可以通过执行以下操作来加载提案:User.includes(:authored_proposals,:editored_proposals).这不是纯粹的铁路方式,但对我来说似乎更清洁.

你也可以做:

class User < ActiveRecord::Base
  has_many :authored_proposals,foreign_key: :editor_id

  has_many : proposals,finder_sql: proc { "SELECT * FROM proposals WHERE (proposals.author_id = #{id} or proposals. editor_id = #{id})" }
end

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...