2016-06-11 17 views
-1

(Das Problem ist doppelt. Jetzt habe ich ein anderes Problem gelöscht.) Ich versuche RoR Active Records mit Association. Und versuchen, zwei Tabellen zu verbinden, die Restaurants und restaurant_translations ist. Diese sind für mehrsprachige Unterstützung aufgeteilt.Wie verbindet man zwei Tabellen mit ActiveRecord?

Hier ist die Definition dieser beiden Tabellen.

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 
end 

Und die Modelle.

class Restaurant < ActiveRecord::Base 
     has_many :restaurant_translations 
end 

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

Und dann ist hier der Controller, der meine Kopfschmerzen verursacht.

class RestaurantController < ApplicationController 
     def list 
       @restaurants = Restaurant.all 
       @restaurants = @restaurants.restaurant_translation.find_by(lang: "en") 
     end 
end 

So zeigt Fehler wie folgt. Kannst du mir sagen, wie man schreibt?

enter image description here

@Pavan ‚s Beratung führt zu einem weiteren Fehler wie dies einige.

enter image description here

BTW, ist meiner Ansicht nach so. Es ist eine .slim-Datei.

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 
+0

Können Sie uns ein Beispiel Ihrer Ansicht zeigen? – Wikiti

+0

@Wikiti Danke für den Kommentar. Das Problem wurde geändert. –

+0

In Ihrer Übersetzungstabelle gibt es keine Spalte 'Restaurantname'. –

Antwort

2

nicht definierte Methode `restaurant_translation‘ für Restaurant :: ActiveRecord_Relation: 0x007f83832cb498

Es gibt zwei Probleme in Ihrem Code

Zuerst Sie .restaurant_translation fordern die .restaurant_translations sein sollte als nach deinen Assoziationen.

Und die zweite, rufen Sie an, dass auf ActiveRecord_Relation die eine Sammlung von Datensätzen ist (das heißt, @restaurants) nicht eine einzelne Instanz.

Ich würde tun wie unten statt zu erreichen, was Sie wollten.

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

Hinweis:

Ihre restaurants Tabelle nicht die restaurant_id von Konvention enthalten sollte.

+0

Danke für die Antwort. Ich habe das geändert, was du mir vor einer Weile gesagt hast, aber es wird nicht funktionieren. Ich zeige dir, wie es sich entwickelt. –

+0

Entschuldigung, das Ersetzen des Skripts verursacht ein anderes Problem. Das ist der fehlende Spaltenname. –

Verwandte Themen