2017-10-11 1 views
0

J'ai deux tables, accounts et items et je voudrais show la buisness_name au lieu du id de la table des comptes sur la page view/items/show.html.erb.Rails: afficher le nom au lieu de Id dans une page show

Actuellement, je n'ai aucune association entre les modèles, mais j'ai la colonne account_id dans la table items.

create_table "accounts", force: :cascade do |t| 
    t.string "buisness_name" 
    t.string "web_site" 
    t.string "phone_number" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
end 

create_table "items", force: :cascade do |t| 
    t.string "title" 
    t.text "description" 
    t.string "image" 
    t.decimal "price" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    t.integer "category_id" 
    t.json "attachments" 
    t.integer "account_id" 
end 

Je reçois le account_id par ceci: <%= @item.account_id %>, mais je voudrais montrer au buisness_name à la place.

+0

JFYI, c'est "business", pas " Business " –

+0

" Actuellement, je n'ai aucune association entre les modèles "- c'est ce que vous devez corriger. –

Répondre

2

Essayez quelque chose comme ça

class Item < ActiveRecord::Base 
    belongs_to :account 
end 

dans la vue

<% if @item.account %> 
    <%= @item.account.buisness_name %> 
<% end %> 

devrait-elle être business_name, comme @Sergio Tulentsev déjà dit

Je mis à jour ma réponse parce que je remarquai de la table que le account_id n'a pas de contrainte not null

2

Si vous avez

<%= @item.account_id %> 

La façon horrible pour obtenir le compte serait

<%= Account.find_by(id: @item.account_id).try(:buisness_name) %> 

serait beaucoup plus intelligent être

class Item 

    belongs_to :account 

    delegate :buisness_name, to: :account, prefix: true, allow_nil: true 

Et puis dans la vue ...

<%= @item.account_buisness_name %> 
+3

Peut vouloir utiliser 'prefix: true' sur ce délégué. Les articles n'ont généralement pas de noms commerciaux. :) –

+0

@SergioTulentsev bon point. – SteveTurczyn