Rails SQL连接两个表,一个表有两个列,其中包含其他表的ID,我需要获取这些ID的名称

时间:2015-04-28 19:12:24

标签: sql ruby-on-rails postgresql join

这是我的关联模型:

class ProjectLineThreshold < ActiveRecord::Base
  belongs_to :project_line
  belongs_to :source, class_name: 'Language'
  belongs_to :target, class_name: 'Language'
end

ProjectLineThreshold表包含以下列(:id,:source_id,:target_id,:score)。我需要在languages表中添加source_id和target_id的语言名称。

我想出了这个陈述:

thresholds = self.project_line_thresholds.joins(:source, :target)
    .select('project_line_thresholds.id, project_line_thresholds.source_id, project_line_thresholds.target_id,
      project_line_thresholds.score, languages.name as source_name, languages.name as target_name')

但我得到了目标和来源的相同名称。什么是正确的连接声明,或者我做错了?

3 个答案:

答案 0 :(得分:2)

您不需要select语句,只需通过关联获取名称:

request.is_ajax()

请注意//To read all lines from a text file: var lines = File.ReadAllLines(filename); foreach(var line in lines) { //Separate by semi-colon: var splitText = line.Split(';'); //Do what ever you want with all pieces like this: var piece = splittext[0]; } 只是确保预加载相关记录,否则它会在循环的每次迭代期间运行单独的查询以检索源和目标。

答案 1 :(得分:1)

以下查询只会命中db一次:

self.project_line_thresholds
  .joins(:source, :target)
  .includes(:source, :target)
  .map {|plt| [plt.id, plt.source_id, plt.target_id, plt.score, source.name, target.name]}

答案 2 :(得分:1)

只有在您希望加载数据时才需要语句,即对所有内容运行一个SQL查询。已经提供了这方面的答案。

否则,您可以使用active record提供的关联方法,例如:

@project_line_threshold.source.name
@project_line_threshold.target.name