10

Rozejrzałem się po Stack Overflow i Agile Development z Railsami, ale nie mogłem znaleźć niczego, co by odpowiadało na wszystkie części tego, czego potrzebuję.Niewłaściwe pluralizowanie modelu w szynach

Właśnie wygenerowałem model Cow w szynach. Najwyraźniej Szyny używa przestarzałego mnogą krowy („krowy”), więc kiedy stworzył ten model, to zbudowali migrację kine:

class CreateKine < ActiveRecord::Migration 
    def change 
    create_table :kine do |t| 
     t.string :name 
     t.string :farm 
     t.string :breed 

     t.timestamps 
    end 
    end 
end 

Wiem, że mógłbym pójść do .rb pliku modelu i set_table_name z powrotem do krowa, ale martwię się o skojarzone kontrolery. Jeśli utworzę kontroler Krowy, czy nie zostanie zsynchronizowany?

Jak uzyskać wszystko, aby być Krowa/krowy? Dzięki. Jest to jedna z moich pierwszych aplikacji i jestem już trochę zdezorientowana, zarządzając powiązaniami modelu kontrolera, więc ten problem z fleksją nie pomaga.

+4

Ta dość nieregularny Arcane przegięcia został [usunięto z szyn kilka dni temu] (https://github.com/rails/rails/commit/c300dca9963bda78b8f358dbcb59cabcdc5e1dc9). Przyszłe wersje będą odpowiednio odstraszały "krowy" jako "krowy". –

+2

Dobrze słyszeć. Chociaż to będzie ssać dla każdego, kto chce napisać aplikację Rails 4, aby zoptymalizować anglosaską hodowlę bydła w XIV wieku. – Sasha

Odpowiedz

26

Załóż przegięcie Oto przykład:

config> inicjalizatory> inflections.rb

ActiveSupport::Inflector.inflections do |inflect| 
    inflect.irregular 'cow', 'cows' 
end 
+0

Świetnie. A potem po prostu uruchom rake db: migrate again? – Sasha

+0

Czy powinienem wycofać model, a następnie wygenerować go ponownie? – Sasha

+3

To jest właściwa odpowiedź. @Sasha, po prostu usuń migrację i ponownie uruchom generator; tym razem powinien generować 'Krowy'. –

2

Spróbuj zmienić nazwę tabeli:

class RenameKineToCows< ActiveRecord:Migration 

    def up 
    rename_table :kine, :cows 
    end 
    def down 
    rename_table :cows, :kine 
    end 
end 

zmienić nazwę aplikacji /models/kine.rb do pliku cow.rb i edytuj plik

class Cow < ActiveRecord::Base 

    self.table_name = 'Cow' 
end 

Zmień nazwę app/controllers/kine_controller.rb do cows_controller.rb i edytować plik

class KineController < ApplicationController 

do

class CowsController < ApplicationController 

i edycji konfiguracji/routes.rb

resources :kine 

do

resources :cows 
+0

Dziękuję bardzo! Wystarczy podwójne sprawdzenie. W migracji, którą napisałeś na górze, czy self.up i self.down powinny być takie same? Lub powinien siebie.może być "rename_table: krowy,: kine"? – Sasha

+0

Ops, masz rację. Dzięki za poprawienie mnie :) –