2016-05-17 13 views
0

Ich arbeite an meinem Schienen api. Es hat einen Modellstandort. Jetzt können Städte mehrere Namen haben. Wie "Bangalore" (Elternobjekt) und "Bangaluru" (Kindobjekt). Das Modell ist selbst referenzierend. Ich möchte eine Einschränkung hinzufügen, um zu verhindern, dass meine Benutzer auf ein untergeordnetes Objekt verweisen. Sie sollten immer auf das Elternobjekt verweisen.selbst Verweis auf Elternobjekt, wenn es Kindobjekt hat

Hier ist mein Code:

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 

Wie kann ich das erreichen? Vielen Dank im Voraus :)

+0

Können Sie ein Beispiel geben, wo der Benutzer auf ein untergeordnetes Objekt verweisen würde? – RSB

+0

Nr. Der Benutzer muss immer auf das übergeordnete Objekt verweisen. Wenn der Benutzer auf Bangalore (Kindobjekt) verweist, muss eine Einschränkung angegeben werden, so dass sich der Benutzer auf "bangaluru" (Elternobjekt) bezieht. – Abhishek

Antwort

0

Ich gehe davon aus, dass Sie in Ihrem locations Tabelle ein parent_id Feld haben, können Sie so etwas wie dieses

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

Jetzt tun, wird user.location.parent_location Sie die übergeordnete Stelle geben, oder Sie können do

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

in Lage Modell,

def parent_location_present? 
    parent_location.present? 
end 

Hoffe das hilft!

+0

Eigentlich habe ich keine parent_id. Der Standort verweist auf sich selbst. Es hat enum wie oben gezeigt. Ich muss nur einen benutzerdefinierten Validator schreiben. def child_location_not_present Gibt false zurück, wenn location.child.present? Ende. Aber es funktioniert nicht. Wie überprüft man, ob ein Kindobjekt vorhanden ist oder nicht? – Abhishek

+0

Wie erhalten Sie location.child? Sie benötigen eine Eltern-ID-Spalte, um dies zu erreichen – RSB