Sim*_*lli 3 ruby ruby-on-rails foreign-keys ruby-on-rails-3
那些天我正在学习 Ruby on Rails,以提高自己作为一名开发人员的水平,因此我开始重写我的一个 php 网站来使用该框架。
基本上该网站是一个源代码聚合器,因此我有一个语言模型和一个源模型:
class Language < ActiveRecord::Base
has_many :sources
end
class Source < ActiveRecord::Base
belongs_to :language
end
Run Code Online (Sandbox Code Playgroud)
与源表中的 language_id 外键绑定。
该网站的主要路线之一是:
get ':language_name/:source_name.html' => 'source#show'
Run Code Online (Sandbox Code Playgroud)
例如:
/ruby/discover-if-a-number-is-prime.html
Run Code Online (Sandbox Code Playgroud)
在 SourceController 中我声明了以下内容:
class SourceController < ApplicationController
def show
language_name, source_name = params[:language_name], params[:source_name]
@language = Language.find_by_name(language_name) || not_found
@source = Source.find_by( name: source_name, language_id: @language.id ) || not_found
end
end
Run Code Online (Sandbox Code Playgroud)
有没有一种聪明的方法来执行这两个查询?
也许像
@source = Source.find_by_name_and_language_name( source_name, language_name ) || not_found
Run Code Online (Sandbox Code Playgroud)
如果这是一个愚蠢的问题,我很抱歉,我也在阅读《Agile Web Development with Rails 3.2》,但与此同时我想尝试一下。
谢谢
从 Marek 答案的评论中询问,可以仅使用 1 个查询joins
@source = Source
.joins(:language)
.where(languages: { name: language_name })
.where(sources: { name: source_name })
.first
Run Code Online (Sandbox Code Playgroud)
这将返回第一个与语言匹配的匹配source项source_namelanguage_name