0

非常に古いレガシー アプリケーションを PHP から Rails に移植していますが、「適切な」RoR の方法で実装する方法がわからない機能に遭遇しました。

基本的に、リードを収集するサインアップ フォームがあります。リードの属性の 1 つは居住地です。アラスカ、フロリダなど

また、バックエンドにログインしてリードのリストを取得できる顧客もいます。これらの顧客のリストは州別にフィルター処理されており、「許可」状態はアカウントに関連付けられています。

私がここに来るずっと前に作成されたオリジナルの PHP アプリケーションは、顧客が「所有」するすべての州の行を作成するかなり複雑な方法を使用しています。これは、相互参照テーブルがかなり大きくなり、PHP コードがこれらのルックアップに基づいて顧客を解析するときに、いくつかの厄介なネストされたループを作成したことを示しています。

私は、States という Rails モデルを作成して、Customer に多数の State を持ち、State に多数の Lead 関係を持たせることを考えましたが、もっと良い方法があるはずです。

別のオプションは、州のリストを顧客ごとに配列として保存し、その配列をテキストとして 1 行に保存してから、配列を使用してデータベースにクエリを実行するか、すべての顧客レコードのすべての州の行を作成し、各州をオンまたはオフの状態。

これはかなり一般的なタイプの関係のように見えるため、レールの組み込み関数が欠けているように感じます。

4

1 に答える 1

0

SQL クエリが難しくなるため、顧客の状態のリストをシリアル化しません。おそらく最善の策は、顧客と州の間に多対多の関係を作成することです (allowed_statesテーブルには acustomer_idと aが保持されますstate_id)。

このようなセットアップはあなたのために働くかもしれません:

class Customer < ActiveRecord::Base
  has_many :allowed_states
  has_many :states, :through => :allowed_states
end

def State < ActiveRecord::Base
  has_many :customers, :through => :allowed_states
  has_many :leads

end

class Lead < ActiveRecord::Base
  belongs_to :state

  def self.filter_allowed_for(customer)
    where(:state_id => customer.state_ids)
  end
end

このようにして、特定の顧客のフィルタリングされたリードのリストを簡単に取得できます。顧客 - 州の関係によりstate_ids、顧客インスタンスにメソッドが作成されることに注意してください。

于 2013-05-10T19:15:29.503 に答える