Rails - 显示来自2个不同连接表的交叉属性的用户

时间:2015-12-18 03:33:29

标签: ruby-on-rails join activerecord intersection

我是初学者,所以问题的标题可能不太清楚。出于这个原因,我很难找到解决问题的方法。我正在开发一个语言学习应用程序,允许用户与希望学习他们的语言的母语人士联系,即正在学习意大利语和西班牙语的母语为英语的人将能够与想要学习英语的母语意大利语和西班牙语的人交流。

我有一个语言表,其语言名称为字符串和2个连接表:Native和Desired。这些都采用user_id和language_id。

我的模型设置如下:

class User < ActiveRecord::Base
  has_many :natives
  has_many :native_languages, through: :natives, source: :language

  has_many :desireds
  has_many :desired_languages, through: :desireds, source: :language
end

class Language < ActiveRecord::Base
    has_many :native_speakers, through: :native_languages, source: :natives
    has_many :desired_speakers, through: :desired_languages, source: :desireds
end

class Native < ActiveRecord::Base
    belongs_to :user
    belongs_to :language
end

class Desired < ActiveRecord::Base
    belongs_to :user
    belongs_to :language
end

我想在User索引上显示匹配的用户,所以我需要帮助查询应该在用户控制器的索引方法中。

这是我在这里发表的第一篇文章,如果我错过了任何重要文章,请告诉我。在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

使用子查询。

我想要的母语者

user = User.find(params[:id])
desired_lanuages = user.desired_languages
User.where(id: Native.select(:user_id).where(language: desired_lanuages))

谁想要我

native_language = user.native_languages
User.where(id: Desired.select(:user_id).where(language: native_language))

<强>匹配

User.where(id: Native.select(:user_id).where(language: desired_lanuages))
  .where(id: Desired.select(:user_id).where(language: native_language))

我不尝试运行代码。但我认为这种代码是可能的