2016-09-24 4 views
0

私はStudentというテーブルを持っています。studentテーブルにはid、first_nameとlast_nameが含まれています。 first_nameとlast_nameを選択して連結し、その列を "Name"として表示しようとしています。これは私のクエリです:選択....とレールの連結で使用する方法5

Student.select("concat(first_name, ' ', last_name) as 'Name'").find(201410204) 

が、それは

SELECT concat(first_name, ' ', last_name) as 'Name' FROM `students` WHERE `students`.`id` = 201410204 LIMIT 1 

#<Student id: nil> 

を返しますが、私は、MySQLのワークベンチ内のクエリを貼り付けしようとすると、それは、ID 201410204、列名が「名前を持っている生徒の名前を返します"

Click to see the result of the query

私のコードについての問題は何ですか?ありがとう

答えて

0

を作成します。

1)(レールの電力を用いて)

Studentモデルにおいてfull_nameという名前のメソッドを作成し、first_name and last_nameを連結。

class Student < ActiveRecord::Base 
..... 

def full_name 
    "#{try(:first_name)} #{try(:last_name)}".to_s 
end 
..... 
end 

今開いているコンソールまたはあなたが必要な場所任意の、

student = Student.find(201410204) 

student.full_name 

のthatsそれを、あなたは完全な名前を取得します。

2)レールのスケーラビリティを使用すると、SQLクエリを実行することもできます。

student = ActiveRecord::Base.connection.exec_query("SELECT CONCAT(first_name,' ', last_name) FROM students where students.id = 201410204") 

それは配列を返し、今あなたが使用して取得することができ、それのthats

student.rows[0]

、あなたは同じ結果を得ることができます。

0

selectで返される列を制限します。クエリでは列Nameのみが返されます。 idと他のすべての列がありません。この場合、すべての属性がnilのstudentのインスタンスが取得されます。属性Nameのみが設定されています。 Student.select("concat(first_name, ' ', last_name) as 'Name'").find(201410204).Nameを試すと、正しい結果が表示されます。

すべては、あなたがこのStudent.select("concat(first_name, ' ', last_name) as 'Name', *").find(201410204)

編集のようなあなたの選択拡張する必要が属性を取得したいときは:私はhttps://de.piliapp.com/mysql-syntax-check/にmysqlのためにそれを確認しなかった

を、私はなぜ知らないが、あなたが持っていますまず*という名前にします。

Student.select("*, concat(first_name, ' ', last_name) as 'Name'").find(201410204)

+0

Student.select( "CONCAT( '名前FIRST_NAME、 '' として、last_nameの)'"、*)を見つける(201410204)は、構文エラーがあります – Gerald

+0

はい、引用符は '*'の後に閉じなければなりません。私はそれを修正した。 – slowjack2k

+0

ありがとうございますが、もう一度エラーを返しました。 SQL構文にエラーがあります。あなたのMySQLサーバのバージョンに対応するマニュアルをチェックしてください。* 'FROM 'students'付近の' students'''' = '201410204 LIMIT 1'(1行目:SELECT concat(first_name、 ''、last_name) '名前'、* FROM 'students'どこの学生' '= 201410204 LIMIT 1 – Gerald

0

一つの解決策

モデルでは、私はあなたに2つのソリューション、scalability of railsを使用してpower of railsおよびその他を使用することで、1つを挙げてみましょう方法

def full_name 
    "#{self.try(:first_name)} #{self.try(:last_name)}" 
end 

Now 

Student.find(121).full_name 
0

あなたにもIDを選択する必要があります。

Student.select(:id, "CONCAT(first_name,' ',last_name) as name").find(201410204) 

2.4.1 :073 > Student.select(:id, "CONCAT(first_name,' ',last_name) as name").find(23000) 
Student Load (0.9ms) SELECT "students"."id", CONCAT(first_name,' ',last_name) as name FROM "students" WHERE "students"."id" = $1 LIMIT $2 [["id", 23000], ["LIMIT", 1]] 
=> #<Student id: 23000, name: "Joe Blow"> 
関連する問題