2017-07-11 3 views
0

私はちょっとしたことで苦労していて、どうやってやるべきか分かりません。 私はUserとStatusテーブルを持っています。そして、すべてのステータスを保持するStatusListテーブルを追加するべきだと思っています。ユーザーはユーザーデータを保持しますが、ステータスは現在のユーザーステータスを保持します。だから、次のようになります。Rails。データベースにリストを保持するのはいい考えですか?どのような関係を使用すべきですか?

Table User id, name, email 
Table Status user_id, status_list_id 
Table StatusList id, name 

そして、私のような関連性を考えていた:

User 
    has_one :status 
    has_one :status_list, through: :status 

Status 
    belongs_to :user 
    has_one :status_list 

StatusList 
    belongs_to :status 

しかし、私は期待するように、これは動作しません。

@u = User.last 
@u.status # => "id: 1" 
@u.status.status_list # => No such column "status_lists" 

しかし、私は、私は[ 'ユーザー'、 'ステータス'、 'status_lists']を参照のActiveRecord :: Base.connection.tablesをチェックすると:私はしようとすると、私が意味します。だから私はGoogleでその問題を解決するために探し始めるが、私は何を見つけることができないので、私はここで尋ねている、この関係はどのように見えるのだろうか?私のアイデアが良いのであれば、私は期待どおりに働いていないのですか?

解決策を見つけるのに役立つヒントがありがとうございます。ここ

答えて

0

これ以上私のサンプルのように設定することができますセットアップ

User 
    # -> status_lists -> statuses 
    has_many :status_lists, :dependent => :destroy 
    accepts_nested_attributes_for :status_lists, :allow_destroy => :true 
    has_many :statuses, through: :status_lists 

StatusList 
    belongs_to :user 
    belongs_to :status 

Status 
    # -> status_lists -> users 
    has_many :status_lists, :dependent => :destroy 
    accepts_nested_attributes_for :status_lists, :allow_destroy => :true 
    has_many :users, through: :status_lists 

ができています管理者が管理コンソールからいつでも変更することができ、あるいはユーザーが自分で新しいステータスを作成することもできる、状況を操作する自由度が高い場合には、正しいソリューションです。その場合には、次の使用:

あなたの状況ではありません、あなたは非常に頻繁に変更するつもりはない状況だけ制限されたセットを持っている(彼らはまだすることができ)、それはとにかく新しい開発を意味します場合
User  
    has_one :status_list, dependent: :destroy 
    has_one :status, through: :status_list 

StatusList 
    belongs_to :user 
    belongs_to :status 

Status 
    has_many :status_lists, dependent: :destroy 
    has_many :users, through: :status_lists 

新しいステータスを管理するよりもはるかに簡単にして、ステータステーブルを削除し、Rails(http://api.rubyonrails.org/v5.1.1/classes/ActiveRecord/Enum.html)のenumsを使用するよりも、

ユーザモデル、ステータスのリストで、 status文字列を持っていると定義するユーザーテーブルを変更し

enum status: [ active: 'active', archived; 'archived' ] 

私は強くあなたが値として、文字列の代わりに、整数と列挙型を定義することをお勧め将来的に維持したり変更したりする方が簡単だからです。

0

は、あなたが「接続モデル」として設定するStatusListと多くのリレーションシップに多くをしたい場合、あなたは

@user = User.last 
@user.statuses # this will show all the user statuses 
@status = Status.last 
@status.users # this will show you all user that has same status 
関連する問題