2016-05-17 26 views
0

私はのrails apiで作業しています。 モデルロケーションがあります。さて、都市は多くの名前を持つことができます。 "Bangalore"(親オブジェクト)や "Bangaluru"(子オブジェクト)のように。モデルは自己参照型です。ユーザーが子オブジェクトを参照できないように制約を追加したいと思います。親オブジェクトを常に参照する必要があります。子オブジェクトがある場合、親オブジェクトに自己参照する

は、ここに私のコードです:

class Location < ActiveRecord::Base 
    belongs_to :location # i.e. may have a parent location 
    has_many :users, dependent: :restrict_with_error 
    validates :name, presence: true, uniqueness: true 

    before_save :lowercase_name 
    auto_strip_attributes :name, squish: true, nullify: false 

    enum status: [ 
     :invisible, # default 
     :major, # a major city 
     :minor, # a minor city 
     :child, # i.e. it has a parent that should be used instead 
    ] 
end 

私はこれをどのように達成することができますか?事前に 感謝:)

+0

ユーザーが子オブジェクトを参照する例はありますか? – RSB

+0

いいえ。ユーザーは常に親オブジェクトを参照する必要があります。ユーザーがバンガロール(子オブジェクト)を参照する場合と同様に、ユーザーが「bangaluru」(親オブジェクト)を参照するように制約を設定する必要があります – Abhishek

答えて

0

は、私はあなたが今、この

belongs_to :parent_location, class_name: 'Location', foreign_key: 'parent_id' 

ような何かを行うことができ、user.location.parent_locationはあなたの親の場所を与える、またはすることができます、あなたはlocations表にparent_idフィールドを持っていると仮定しています場所モデルで

location = user.location 
location = location.parent_location_present? ? location.parent_location : location 

def parent_location_present? 
    parent_location.present? 
end 
を行います

これが役に立ちます。

+0

実際にはparent_idはありません。場所は自分自身を参照しています。上記のようにenumがあります。私はちょうどカスタムバリデータを書く必要があります。 def child_location_not_present location.child.presentの場合はfalseを返します。 終了。しかし、それは動作しません。子オブジェクトが存在するかどうかをチェックする方法は? – Abhishek

+0

どのようにlocation.childを取得しますか?これを達成するには、親ID列が必要です – RSB

関連する問題