如何使用ActiveRecord连接两个表?

时间:2016-06-11 11:24:21

标签: ruby-on-rails activerecord

(抱歉,此问题重复。现在,我删除了另一个问题。) 我正试用RoR Active Records with Association。 并试图连接两个表,这是餐厅和restaurant_translations。这些是分开的,以支持多语言。

这是这两个表的定义。

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

和模特。

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.all
                @restaurants = @restaurants.restaurant_translation.find_by(lang: "en")
        end
end

因此错误显示如下。你能告诉我怎么写吗?

enter image description here

@Pavan的建议会导致其他一些错误。

enter image description here

顺便说一下,我的观点是这样的。它的.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

1 个答案:

答案 0 :(得分:2)

  

未定义的方法`restaurant_translation&#39;对于   餐厅:: ActiveRecord_Relation:0x007f83832cb498

您的代码中存在两个问题

首先,根据您的关联,您正在调用.restaurant_translation .restaurant_translations

第二个,你在 ActiveRecord_Relation 上调用它,这是一个记录集合(即@restaurants)而不是单个实例< / em>的

我想在下面做,而不是实现你想要的。

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

注意:

您的restaurants表格不应包含约定的restaurant_id