個人的には、もう少し慣習的にするために、私は使用します
class User < ActiveRecord::Base
scope :has_name, where("users.name != ''")
end
name
このようにして、モデルが別のモデルと結合されたときに、複数のテーブルに列がある場合に列のあいまいさが発生することはありません
この例を考えてみましょう
$ rails new app
$ cd app
$ rails g resource User name:string company_id:integer
$ rails g resource Company name:string
$ rake db:migrate
私たちのモデル
class User < ActiveRecord::Base
belongs_to :company
scope :has_name, where("name != ''")
end
class Company < ActiveRecord::Base
has_many :users
end
問題
$ rails c
irb> User.has_name.join(:company)
いやいや!
User Load (0.4ms) SELECT "users".* FROM "users" INNER JOIN
"companies" ON "companies"."id" = "users"."company_id" WHERE
(name != '')
SQLite3::SQLException: ambiguous column name: name: SELECT
"users".* FROM "users" INNER JOIN "companies" ON
"companies"."id" = "users"."company_id" WHERE (name != '')
ActiveRecord::StatementInvalid: SQLite3::SQLException: ambiguous
column name: name: SELECT "users".* FROM "users" INNER JOIN
"companies" ON "companies"."id" = "users"."company_id" WHERE
(name != '')
スコープを固定しよう
class User < ActiveRecord::Base
belongs_to :company
scope :has_name, where("users.name != ''")
end
クエリを再実行します
irb> reload!
irb> User.has_name.join(:company)
適切な出力
User Load (0.1ms) SELECT "users".* FROM "users" INNER JOIN "companies"
ON "companies"."id" = "users"."company_id" WHERE (users.name != '')
=> []