这是我的关联模型:
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')
但我得到了目标和来源的相同名称。什么是正确的连接声明,或者我做错了?
答案 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