質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

解決済

1回答

1986閲覧

ActiveRecordの結合検索の表示

hrc

総合スコア55

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

0クリップ

投稿2016/06/12 06:41

###前提・実現したいこと
RailsでActiveRecord使って複数のテーブルの結合をしようとしております。
多言語のレストランガイドのイメージです。どの言語でも共通のテーブルと言語ごとの情報のファイルを結合しております。
従属する方のテーブルに条件つけて取りたい(英語ならlangはen、日本語ならja)のですが、Viewで取り出す際にエラーになってしまいます。
Associationの設定がダメなのか、取り出し方の問題なのか判別つかないのでご教示いただければ幸いです。

###発生している問題・エラーメッセージ
以下は出力されているエラーです。

undefined local variable or method `restaurant'

イメージ説明

###該当のソースコード

テーブル定義はこんな感じです。

ruby

1create_table "restaurant_translations", id: false, force: :cascade do |t| 2t.integer "id", limit: 4, default: 0, null: false 3t.integer "restaurant_id", limit: 4 4t.string "restaurantname", limit: 255 5t.string "address", limit: 255 6t.string "tel", limit: 255 7t.text "description", limit: 65535 8t.string "lang", limit: 255, default: "", null: false 9t.datetime "created_at", null: false 10t.datetime "updated_at", null: false 11end 12 13create_table "restaurants", force: :cascade do |t| 14t.string "restaurant_type", limit: 255 15t.string "genre", limit: 255 16t.string "url", limit: 255 17t.string "fb", limit: 255 18t.string "mailaddr", limit: 255 19t.datetime "created_at", null: false 20t.datetime "updated_at", null: false 21end

こっちはController。

ruby

1class RestaurantController < ApplicationController 2 def list 3 @restaurants = Restaurant.all 4 @restaurants = @restaurants.restaurant_translation.find_by(lang: "en") 5 end 6end

こちらはModelファイル。

ruby

1class Restaurant < ActiveRecord::Base 2 has_many :restaurant_translations 3end 4 5class RestaurantTranslation < ActiveRecord::Base 6 self.table_name = 'restaurant_translations' 7 belongs_to :restaurant 8end

こちらはViewファイルです。

ruby

1View(.slim) 2 3table 4 thead 5 tr 6 th = t :restraunt_list_type 7 th = t :restraunt_list_name 8 th = t :restraunt_list_url 9 th = t :restraunt_list_genre 10 th = t :restraunt_list_addr 11 12 tbody 13 - @restaurants.each do |restaurant| 14 tr 15 td = restaurant.restaurant_type 16 td = restaurant.restaurant_translations.first.restaurantname 17 td = link_to 'here', restaurant.url 18 td = restaurant.genre 19 td = restaurant.restaurant_translations.first.address

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ちょっとエラーの出方が不可解で、どうしてこのエラーが出ているのかよくわかりません。

しかし、listアクションのメソッドの2行目、
@restaurants = @restaurants.restaurant_translation.find_by(lang: "en")
だと、
RestrauntTranslationクラスのインスタンスが@restrauntsに入るような気がします。

おっしゃっている条件付きの関連取得は、おおかた2種類の方法で取得可能かとおもいます。

その1
Viewで取得し直す

Ruby

1tbody 2 - @restaurants.each do |restaurant| 3 tr 4 td = restaurant.restaurant_type 5 td = restaurant.restaurant_translations.where(lang: "en").first.restaurantname

その2
scopeを使う

Ruby

1class RestaurantTranslation < ActiveRecord::Base 2 self.table_name = 'restaurant_translations' 3 belongs_to :restaurant 4 5 scope with_lang: ->(lang) { where lang: lang } 6end 7 8# view 9tbody 10 - @restaurants.each do |restaurant| 11 tr 12 td = restaurant.restaurant_type 13 td = restaurant.restaurant_translations.with_lang("en").first.restaurantname

こんな感じでしょうか。

投稿2016/06/12 13:59

rifuch

総合スコア1901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hrc

2016/06/13 11:01

ありがとうございます!遅くなりすみません。これから試してみます。
hrc

2016/06/13 21:05

こちらその2を試してみましたところ wrong number of arguments (1 for 2) と出てしまいました。scopeのところです。何が悪いのでしょうか?見た目引数は合ってそうに見えます・・・。
rifuch

2016/06/13 23:57

すみません、呼び出しの方の記述が間違ってました。 restraurant.restraurant_translaations.with_lang("en")でした。 scopeのlambda式の引数は、langに入れる文字列です。
hrc

2016/06/14 01:00

ありがとうございます!動きました。
rifuch

2016/06/14 02:00

無事動いて良かったです。 間違った情報、すみませんでした。
hrc

2016/06/14 06:44

いえいえ、おかげでスコープの使い方の勉強になりました。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問