1

これは、モデル フィールドの処理に関する一般的な質問であり、これが正しい方法であるかどうかを知りたいだけです。モデルがあり、ユーザーがそのモデルHouseの 10 個の機能から選択できるとします。

Swimming Pool
Hot Tub
Tennis Court
Boat Parking
Horse Facilities
Balcony
Pets Allowed
Energy Efficient
Lease Option
Disability Features

これは、10個のブール列を作成する必要があることを意味しますよね? これほど多くのテーブル列を扱ったことがないので、よくわかりません。こんなにたくさん持っているのは普通のことですか?

ありがとうございました。

4

5 に答える 5

6

もう1つのオプションは、HouseOptions(または任意のもの)というテーブルを作成してから、UserHouseOptionsなどの結合テーブルを作成することです。

AR関係は次のようになります。

# user.rb
has_many :user_house_options
has_many :house_options, :through => :user_house_options

# user_house_options.rb
belongs_to :user
belongs_to :house_options

# house_options.rb
has_many :user_house_options
has_many :users, :through => :user_house_options

したがって、ユーザーには余分な列はありません。AR関係を介してその結合テーブルを持っているだけです。ユーザーハウスオプションには、user_idとhouse_options_isの2つの列があります。そして、House Optionsには文字列列(「スイミングプール」など)だけがあり、それは単なる参照テーブルです。

has_many:throughリレーションシップ(およびサンプルコード)の詳細については、このRailsガイドを確認して ください:http: //guides.rubyonrails.org/association_basics.html#the-has_many-through-association

于 2012-05-09T15:12:27.207 に答える
4

フィールドの数に心配はありませんが、新しい機能を簡単に実装できるように、設計を一般化することをお勧めします。

彼はデザインの 1 つのアイデアです。

> rails generate Model Feature type:string house_id:integer

class House < ActiveRecord::Base
  has_many :features
end

class Feature < ActiveRecord::Base
  belongs_to :house
end

class SwimmingPool < Feature
  def to_s
    "Swimming Pool"
  end
end

house = House.create
house.features << SwimmingPool.new
house.save!

house.features.each do |feature|
  puts feature
end
于 2012-05-09T15:37:48.070 に答える
2

これは実行可能かもしれませんが、コードの実装は面倒かもしれません。考えられる解決策の1つは、シリアル化することです

class User < ActiveRecord::Base
  serialize :preferences
end

user = User.create(:preferences => { "background" => "black", "display" => large })
User.find(user.id).preferences # => { "background" => "black", "display" => large }

ここでは、単なるハッシュである設定を使用しますが、配列を使用することもできます

別の解決策は、機能ごとにテーブルを作成し、結合を使用することですが、それはさらに厄介な作業になる可能性があります。私はこれをもっと熟考しながら私の答えを更新します

于 2012-05-09T15:13:00.387 に答える
2

私の他の答え(ポリモーフィッククラスを使用)は単なるアイデアです。もう 1 つのより単純な方法は、feature_types テーブルを作成し、名前フィールドに Swimming Pool をリストし、多対多のリンク テーブルを作成することです。has_many :through を参照してください。

このテーブル ソリューションは、簡単に拡張して別の型を追加できます。

クラス固有の動作を拡張したい場合、ポリモーフィック クラス ソリューションは拡張可能です。たとえば、スイミング プールには、機能テーブルの品質データに基づいて to_s に「オリンピック サイズ」などのデータが含まれる場合があります。

于 2012-05-09T17:30:39.373 に答える
1

用途に応じて、たとえば機能と呼ばれる配列のフィールドを作成し、家が持つ機能のタイプをその配列に挿入できます。

于 2012-05-09T15:09:04.130 に答える