Błąd zapytania

Witam

def download_accepted? @development = Development.find_by_id(params[:id]) @development.requests.accepted.active end
model: development

  • has_many :requests

model: request

named_scope :accepted, :conditions => ["accepted IS TRUE"] named_scope :active, :conditions => ["expire > ?", Time.now]
Zapytanie wykonane przez:
@development.requests.accepted.active

SELECT * FROM “developments” WHERE (“developments”.“id” = 71) ORDER BY issue_year DESC, title ASC

dlaczego nie ma tu dołączonego modelu requests i warunków accept i active?

Pozdrawiam

To jest raczej zapytanie wykonane przez:

Development.find_by_id(params[:id])

btw: Development.find(params[:id])

Zgadza się. TO dlaczego nie wykonyje się wcale @development.requests.accepted.active ?

A jak i gdzie wykorzystujesz tą metodę download_accepted?

access_control do deny :guest, :to => :download, :unless => :download_accepted? end
Jak zamiast

@development.requests.accepted.active
dam

@development = Development.find(:all, :joins => :requests, :conditions => ["requests.development_id = ? AND requests.user_id = ? AND requests.accepted IS TRUE AND expire > ?", params[:id], current_user, Time.now])
To zapytanie dobrze się składa i wynik jest OK.

Może masz coś nieprawidłowego w modelach?
sprawdź samo

@development.requests

a później poszczególne named scope’y,
w ten sposób szybciej znajdziesz gdzie leży błąd.

Jak dałem samo @development.requests to wcale nie było zapytania jak by tego nie było. A może problem w ? na końcu?
-deny :guest, :to => :download, :unless => :download_accepted? <----

Poza tym w modelach tylko ważne wby było has_many :requests i wsio?

Pokaż kod który masz w kontrolerze i postaraj się dokładniej opisać co chcesz osiągnąć, bo w tej chwili nie jest to dla mnie zbyt jasne :slight_smile:

Sprawdziłem jeszcze raz i

@development.requests

wygląda tak

SELECT * FROM “developments” WHERE (“developments”.“id” = E’76’) ORDER BY issue_year DESC, title ASC LIMIT 1

w ogóle nie ma joina do requests.

Nie wywala też żadnego błędu.
Po prostu wykonuje kod SQL podany powyżej.

w modelu development mam has_many :requests

Kontroler wygląda tak:

[code=“ruby”]class DevelopmentsController < ApplicationController
rescue_from ‘Acl9::AccessDenied’, :with => :access_denied

access_control do
deny :guest, :to => :download, :unless => :download_accepted? <----------------
end

def index


private

def download_accepted?
@development = Development.find_by_id(params[:id]) /1
@development.requests /2
end[/code]
1 - generyje dobry kod:
SELECT * FROM “developments” WHERE (“developments”.“id” = E’76’) ORDER BY issue_year DESC, title ASC LIMIT 1
2 - generuje zły kod bez joina do requests, kod identyczny jak powyżej
SELECT * FROM “developments” WHERE (“developments”.“id” = E’76’) ORDER BY issue_year DESC, title ASC LIMIT 1

jak zamiast @development.requests dam

Development.find(:all, :joins => :requests, :conditions => ["requests.development_id = ? AND requests.user_id = ? AND requests.accepted IS TRUE AND expire > ?", params[:id], current_user, Time.now])

to zapytanie ładnie się wykonuje.

download_accepted? ma zwracać true lub false.
True jeśli znajdzie jakieś rekordy.
False gdy nie znajdzie żadnego.

Pozdrawiam