2012-02-12 9 views
0

これは、rails 3 associations errorの再投稿とみなされます。しかし、私はそれを理解できません。しかし、大丈夫です...契約を聞きました。ここでは、テーブルスキーマに関連する質問をしました。ポストはwhat is bad in this table schema structureで、クエリされました:ruby​​ on rails associations初心者

`CREATE TABLE "pages" (
    "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
    "title" varchar(255), 
    "body" varchar(255), 
    "author" varchar(255), 
    "email" varchar(255), 
    "reference" varchar(255), 
    "created_at" datetime, 
    "updated_at" datetime);` 

私は著者のために別々のテーブルを作成する必要があることを示唆された、そしてそれは私が試したと台無しにするものです。誰も私のシナリオでどのように連携しなければならないのか教えてください。私は本当にRORの関連性をよく理解する必要があります。

編集-1

ここでは私のページの移行コードです:

class CreatePages < ActiveRecord::Migration 
    def self.up 
    create_table :pages do |t| 
     t.string :title, :unique => true, :limit => 50 
     t.string :body, :limit =>255 
     t.string :email, :unique => true, :limit => 50 
     t.string :reference, :limit => 40 
     t.timestamps 
    end 

    end 

    def self.down 
    drop_table :pages 
    end 
end 

、ここでは私の著者の移行です:

class CreateAuthors < ActiveRecord::Migration 
    def change 
    create_table :authors do |t| 
     t.string :author, :unique => true, :null => false, :limit => 50 
     t.timestamps 
    end 
    end 
end 
+0

ガイドを見てみましたか? http://guides.rubyonrails.org/association_basics.html – MrDanA

+0

@MrDanAはい、私はそれを見ました。問題は私がモデルに関連付けられたフォームを持っていることです。そして、私がページテーブルから著者テーブルを分離したとき、私はまだ私は修正することができないいくつかのエラーを持っています。私はあなたが私に送ったリンクによってアイデアを得ることができませんでした。 – Maverick

+0

どのような種類のエラーが表示されていますか?投稿されたあなたの質問は、「私は自分のフォームに誤りがあります」(これは別の質問です)ではなく、「どのように関連が働くべきか」です。 –

答えて

1

我々は論理的介してこれを考える場合、著者が持っているかもしれません多くのページ、ページは著者に属します。その場合、私たちはレール関係を通じてこれを表現することができます。

class Author < ActiveRecord::Base 
    has_many :pages 

class Page < ActiveRecord::Base 
    belongs_to :author 

これをサポートするには、ページテーブルにauthor_id列があることを確認するために移行を作成する必要があります。 Railsは残りの部分を処理します。

my_page.author.email 
my_page.author.name 

あなたは、必ずしもあなたのユーザーがあなたの執筆者である場合Authorクラスを持っている必要はありません

注意(ご使用者のクラスは、このような属性を持っていると仮定して):のようにあなたは、すべての関係のセマンティクスを取得します。すべての作成者は、利用者である(そして、あなたが認証およびアカウント保守のために自分のUserクラスを使用)した場合、あなたはまだないであなたは素敵な著者のセマンティクスを維持することができますクラス

class Page < ActiveRecord::Base 
    belongs_to :author, :class_name => "User" 

の著者としてユーザーを参照することができますあなたのUserクラスに対してあなたは、著者のオブジェクトを削除したときに自動的に作者に関連付けられている任意のページを削除したい場合、あなたは著者のための別のテーブルを作成Authorクラス

class Author < ActiveRecord::Base 
    has_many :pages, :dependent => :destroy 
+0

説明のためにありがとう。私は自分の質問を編集し、マイグレーションクラスコードを入れました。何がそこで変更する必要がありますか? – Maverick

1

に依存性を追加することができます

最終的なノートでは、おそらく良いアイデアです(ただし、これは既にうまくいくし、パフォーマンスに問題がない場合でもそのまま残すことができます)。

@Marc TalbotはあなたのRailsモデルで関連付けを設定する方法について既に良い答えを与えてくれました。もちろん、データベースを移行する必要もあります。これは何をすべきかです:

  1. "authors"という表を作成します。プライマリキー "id"のほかに、 "email"と同様に "name"というフィールドが必要です。論理的には常に同じ著者の「ページ」から「著者」まで同じである他のフィールドを移動することができます。
  2. 整数フィールド "author_id"を "pages"に追加します。
  3. "ページ"の既存のエントリを上書きします。各ページについて、著者がすでに「著者」にいるかどうかをチェックします。そうでない場合は、著者を「著者」に追加し、「名前」、「電子メール」、および「著者」の他のフィールドに記入してください。authorsテーブルの正しいIDを参照するように「author_id」を設定します。
  4. "author"、 "email"、および他の移動フィールドを "pages"から削除します。
+0

alex ..あなたが言及した第3ステップをどのように実行するかわからないのですか? – Maverick

+1

@mad_programmerの場合、DBに貴重なデータがまだない場合は、BをスキップしてDBを消去してからやり直すことができます。貴重なデータがある場合は、 "authors"テーブルのすべての著者を取得し、各ページの "author_id"を "authors"テーブルの正しいレコードを指すようにするだけです。そのマイグレーションを書くのに助けが必要な場合は、別のコメントを投稿してください。 –

+0

私は今、両方のテーブルに何も持っていません。そして、はい、私は '@ page'モデル要素を表示するために使用している部分的なフォームにもっと助けが必要です。 form.html.erbを貼り付けますか?私はちょうどそのフォームの中で著者テーブルエレメントを使用し、データを保存する必要があることを知りたいです – Maverick