2016-05-04 5 views
0

Ich versuche zu verwenden, wo Abfrage mit Beziehungen und update_at vergleichen.Ruby on Rails, wo Abfrage mit Beziehungen und update_at vergleichen

Wenn ich diese Abfrage mit updated_at params sende, möchte ich nur die neuesten Gründe abrufen, die durch updated_at date gefiltert wurden, aber es filtert mit Projekt updated_at, nicht nach Gründen update_at.

Wie kann ich das beheben, um Gründe Daten mit update_at Filter zu erhalten?

@Getting Gründe mit updated_at Filter

https://server.com/api/v1/entries?updated_at=2016-05-02T01:12:57.204Z 

@Model

User 
    has_many :projects 
    has_many :reasons, through: :projects 

Project 
    belongs_to :user 
    has_many :reasons 

Reasons 
    belongs_to :project 

@Reasons Controller

# GET /reasons 
    def index 
    reasons  = current_user.reasons 
    updated_at = params[:updated_at] 

    # Filter with updated_at for reloading from mobile app 
    if updated_at.present? 

     # This is my first try, but it shows error because of relations 
     # reasons = reasons.where("updated_at > ?", DateTime.parse(updated_at))  

     # This shows reasons data, but it only compares updated_at in Project data, not reasons data... 
     reasons = reasons.joins(:project).where("projects.updated_at > ?", DateTime.parse(updated_at)) 

    # Get all non deleted objects when logging in from mobile app 
    else 
     reasons = reasons.where(deleted: false) 
    end 

    render json: reasons 
    end 
+0

Vielleicht habe ich Ihren Beitrag nicht verstanden, aber warum versuchen Sie nicht als nächstes: 'Gründe.Funktionen (: Projekt) .where (" Gründe.aktualisiert_at>? ", DateTime.parse (aktualisiert_at))'? – kunashir

+0

'Gründe = Gründe.joins (: Projekt) .where (" projects.updated_at>? AND Gründe.aktualisiert_at>? ", DateTime.parse (updated_at))' - versuchen Sie dies als Where-Klausel sollte Bedingung mit 'updated_at überprüfen 'Attribute der Tabelle 'Projekte' und 'Gründe'. – dp7

+0

Das war es! Danke für euch beide. –

Antwort

1

Sie holen projects.updated_at, aber wenn ich dich verstanden Recht benötigen Sie reasons.updated_at

reasons = reasons.joins(:project).where("reasons.updated_at > ?", DateTime.parse(updated_at)) 

produses zu holen, dass die Ausgabe für mich

GET http://localhost:3000/reasons/index?updated_at=2016-05-04T06:43:19.280Z 

[ 
    { 
     "id": 2, 
     "name": "R2", 
     "project_id": 3, 
     "created_at": "2016-05-04T06:43:19.280Z", 
     "updated_at": "2016-05-04T06:43:19.280Z", 
     "deleted": false 
    }, 
    { 
     "id": 3, 
     "name": "R3", 
     "project_id": 3, 
     "created_at": "2016-05-04T06:43:25.895Z", 
     "updated_at": "2016-05-04T06:43:25.895Z", 
     "deleted": false 
    } 
] 

und ohne Filter

GET http://localhost:3000/reasons/index 

[ 
    { 
     "id": 1, 
     "name": "R1", 
     "project_id": 3, 
     "created_at": "2016-05-04T06:43:11.044Z", 
     "updated_at": "2016-05-04T06:43:11.044Z", 
     "deleted": false 
    }, 
    { 
     "id": 2, 
     "name": "R2", 
     "project_id": 3, 
     "created_at": "2016-05-04T06:43:19.280Z", 
     "updated_at": "2016-05-04T06:43:19.280Z", 
     "deleted": false 
    }, 
    { 
     "id": 3, 
     "name": "R3", 
     "project_id": 3, 
     "created_at": "2016-05-04T06:43:25.895Z", 
     "updated_at": "2016-05-04T06:43:25.895Z", 
     "deleted": false 
    } 
] 
+0

Sie haben Recht, danke! –

0

Es änderte sich nur um reasons.updated_at, danke!

reasons = reasons.joins(:project).where("reasons.updated_at > ?", DateTime.parse(updated_at))