0

私はRubyonRailsでWebアプリを作成しようとしています。これにより、さまざまなレストランのメニューが収集され、アプリに表示されます。多対多の関係を作りたいのですが、少し混乱しています。私は多対多の関係をグーグルで検索し、HABTMまたはhas_many / belongs_toについて読みましたが、まだ少し混乱しています。私のクラス:

レストラン={名前}

メニュー={名前、価格}

そして、テーブルに参加します。

menu_restaurant={日付}

私はここで混乱しています。結合テーブルに追加の値を指定してHABTMを使用できないことを読みました。また、HABTMを使用した結合テーブルのモデルは必要ありません。

私の現在のモデル:app / models / menu.rb

class Menu < ActiveRecord::Base
  attr_accessible :cenaStudent, :name
  has_many :restaurants, dependent: :destroy
  validates :priceStudent, presence: true
  validates :name, presence:true
end

app / models / restaurant.rb

class Restaurant < ActiveRecord::Base
  attr_accessible :name
  has_many :menus, dependent: :destroy

  validates :name, presence: true 
end

app / models / menu_restaurant.rb

class MenuRestaurant < ActiveRecord::Base
  attr_accessible :date
end

これらは私のdbテーブルdb/migrate /{timestamp}_create_restaurants.rbと同様の{...}menu.rbです。

class CreateRestaurants < ActiveRecord::Migration
  def self.up
    create_table :restaurants do |t|
      t.string :name

      t.timestamps
    end
  end

  def self.down
    drop_table :restaurants
  end
end

db / migrate / {timestamp} _create_menus_restaurants.rb

class CreateMenusRestaurants < ActiveRecord::Migration
  def up
    #create the association table
    create_table :menus_restaurants, :id => false do |t|
      t.integer :menu_id, :null => false
      t.integer :restaurant_id, :null => false
      t.date :date
    end

    #add index
    add_index :menus_restaurants, [ :menu_id, :restaurant_id]

  end

  def down
    remove_index :menus_restaurants, :column => [ :menu_id, :restaurant_id]
    drop_table :menus_restaurants
  end
end

Ruby on Railsでどのような関係を使用しますか?どのモデルが必要ですか?

そして、RoRMVCアーキテクチャに関連する2番目の質問があります。関連しているのでここに書きます。

メニューリストを含むPDFファイルをダウンロードする関数をrubyで作成しました。メニュー名と価格を解析します。レストラン名はPDFファイルと一致しています。だから私はそれらをdbに挿入するために必要なデータを持っています。どうすればどこでそれを行うことができますか?いくつかの部分はコントローラーにあり、関数はlibディレクトリにあるべきだと思いますか?これは、任意のアーキテクチャを使用する私の最初のアプリです。これは私の最初のスタックオーバーフローの質問でもあります。何も忘れなかったといいのですが。

4

2 に答える 2

4

アソシエーションテーブルに属性を追加する場合は、アソシエーションを通じてhas_manyを使用する必要があります。

class Menu < ActiveRecord::Base
 has_many :menu_restaurants
 has_many :restaurant, :through => :menu_restaurants
 attr_accessible :cenaStudent, :name
 validates :priceStudent, presence: true
 validates :name, presence:true
 ...
end

class MenuRestaurant < ActiveRecord::Base
 belongs_to :menu
 belongs_to :patient
 attr_accessible :date
 ...
end

class Restaurant < ActiveRecord::Base
  has_many :menu_restaurants
  has_many :menus, :through => :menu_restaurants
  validates :name, presence: true 
end
于 2013-02-04T15:14:26.847 に答える
2

ほぼそこにいると思います。結合テーブル:menu_restaurantsを処理することを除いて、移行とモデルは問題ないようです。

結合テーブルがすべてをフックするようにモデルを変更しました

class Menu < ActiveRecord::Base
  attr_accessible :cenaStudent, :name
  has_many :menu_restaurants
  has_many :restaurants, through: :menu_restaurants , dependent: :destroy
  validates :priceStudent, presence: true
  validates :name, presence:true
end

class Restaurant < ActiveRecord::Base
  attr_accessible :name
  has_many :menu_restaurants
  has_many :menus, through: :menu_restaurants , dependent: :destroy
  validates :name, presence: true 
end

class MenuRestaurant < ActiveRecord::Base
  attr_accessible :date
  belongs_to :menu
  belongs_to :restaurant
end

また、あなたの結合テーブルはmenu_restaurants(menuという単語では単数)と呼ばれるべきだと思います

于 2013-02-04T15:19:38.317 に答える