2016-06-11 6 views
0

私はRoRアクティブレコードを関連付けることを試みています。 レストランとレストランの2つのテーブルを接続しようとしています。これらは複数言語サポートのために分割されています。ActiveRecordsテーブルを関連付けるときにメソッドエラーは表示されません

これらの2つのテーブルの定義は次のとおりです。

create_table "restaurant_translations", id: false, force: :cascade do |t| 
    t.integer "id",    limit: 4,  default: 0, null: false 
    t.integer "restaurant_id", limit: 4 
    t.string "restaurantname", limit: 255 
    t.string "address",  limit: 255 
    t.string "tel",   limit: 255 
    t.text  "description", limit: 65535 
    t.string "lang",   limit: 255, default: "", null: false 
    t.datetime "created_at",        null: false 
    t.datetime "updated_at",        null: false 
    end 

    create_table "restaurants", force: :cascade do |t| 
    t.string "restaurant_type", limit: 255 
    t.string "genre",   limit: 255 
    t.string "url",    limit: 255 
    t.string "fb",    limit: 255 
    t.string "mailaddr",  limit: 255 
    t.datetime "created_at",     null: false 
    t.datetime "updated_at",     null: false 

とモデル。

class Restaurant < ActiveRecord::Base 
     has_many :restaurant_translations 
end 

class RestaurantTranslation < ActiveRecord::Base 
     self.table_name = 'restaurant_translations' 
     belongs_to :restaurant 
end 

次に、私の頭痛を引き起こすコントローラがあります。

class RestaurantController < ApplicationController 
     def list 
       @restaurants = Restaurant.includes(:restaurant_translations).where('restaurant_translations.lang = ?', "en").references(:restaurant_translations) 
logger.debug @restaurants 
     end 
end 

ファイル(.slim)は次のようなものです。

h1 = t :restraunt_list_title 

table 
    thead 
    tr 
     th = t :restraunt_list_type 
     th = t :restraunt_list_name 
     th = t :restraunt_list_url 
     th = t :restraunt_list_genre 
     th = t :restraunt_list_addr 

    tbody 
    - @restaurants.each do |restaurant| 
     tr 
     td = restaurant.restaurant_type 
     td = restaurant.restaurant_translations.first.restaurantname 
     td = link_to 'here', restaurant.url 
     td = restaurant.genre 
     td = restaurant.restaurant_translations.first.address 


br 

「エラーが発生しました」というエラーが発生します。関連テーブルパラメータを表現する方法を教えてください。前もって感謝します。

enter image description here

PS。後続のビューを固定した後、結果は次のようになります。 enter image description here

cf. restaurant_translationは次のようなものです。 enter image description here

答えて

1
私はあなたがそのような場合には、あなたが呼び出しされなければならない、 restaurant_translationsに定義された名前のメソッドを呼び出すようにしようとしている推測している

tr 
    td = restaurant.restaurant_type 
    td = restaurant.restaurant_translations.first.name 
    td = link_to 'here', restaurant.url 
    td = restaurant.genre 
    td = restaurant.restaurant_translations.first.address 

しかし、あなたのコードにいくつかの修正、

  1. あなたもにrestaurantを結びつけるする場合を除き、それはすでにidとして定義されているので、あなたは、レストランでrestaurant_id列を必要としませんを使ってbelongs_toの関連付けを行うと、restaurant_translation_idという列が必要になります。私は少し冗長思われる、あなたはrestaurant_translationid列を除くと、まだそれを再度追加していることがわかり、さらにあなたには、いくつかの先進的なActiveRecordの機能を利用したい場合、あなたはid

    を必要とするだろう

  2. それはあなたのrestaurants_controllerではRailsの

  3. によって推測されるようあなたがrestaurant_translationモデルに対して、table_nameを指定する必要はありません

  4. 、あなたは@restaurantsを割り当て、restaurant_translationsにすぐにそれを再割り当てしています。私はあなたが何をやろうとしているのかわからないが、それは正しいとは思わない。

  5. あなたの将来の自己が理解できるように、アプリケーションで一貫した名前を維持しようとする。例では、私はあなたが

restaurant_list_typeは他の人があるかもしれません言いたかったと思い、restraunt_list_typeの使用であるが、これらは私の目はすぐに捕まえものです。

UPDATE あなたはすべてのあなたのrestaurantsは少なくともrestaurant_translationを持っていることを確認するためにデータベースをチェックする必要があります。エラー:...for NilClassは、restaurant_translationが空の配列であることを意味します。あなたは、少なくともrestaurant_translationを持つすべてのrestaurantsを取得したい場合は、次のような、あなたのコントローラでjoins vs includesを使用する必要があります:

Restaurant.joins(:restaurant_translations).where(restaurant_translations: { lang: "en"}).references(:restaurant_translations) 

をしかし、あなたがして、すべてのレストランを取得したい場合は/ restaurant_translationsせず、その後、私はあなたがObject#tryメソッドを使用して、あなたの質問に、以前の回答のアプローチに行くべきでしょうね。間違った記述のための

tbody 
    - @restaurants.each do |restaurant| 
     tr 
     td = restaurant.restaurant_type 
     td = restaurant.restaurant_translations.first.try(:restaurantname) 
     td = link_to 'here', restaurant.url 
     td = restaurant.genre 
     td = restaurant.restaurant_translations.first.try(:address) 
+0

申し訳ありません。私は現在のコントローラを書いていない。 現在のコントローラのソースコードを更新しました。もう一度調べていただけますか? –

+0

ええ、 'td = restaurant.restaurant_translations.first.restaurantname'を' td = restaurant.restaurant_translations.first.name'に変更してください。 – oreoluwa

+0

まだ動作しません。エラーは "未定義のローカル変数またはメソッド"レストラン "" –

関連する問題