2013-08-06 4 views
0

У меня проблемы с включением statment.Rails model - User.includes (: profile)

Моя модель поиска выглядит следующим образом:

users = User.includes(:profile) 
users = users.active 
users = users.where('users.age = ?', value) 
users = users.where('profiles.abc = ?',value2) 

Моя модель пользователя:

scope :active, where('users.has_photo = ?', true) 

Что происходит. Когда я не получил в поисковой модели «users = users.active» - все работает. Левое внешнее соединение выполнено. Почему этот «лишний» статус уничтожает левое внешнее соединение? Im новый в рельсах и sql soo, возможно, это очень просто.

Когда я получил нету пользователей = users.active - запрос как этот

SELECT COUNT(DISTINCT "users"."id") FROM "users" LEFT OUTER JOIN "profiles" ON "profiles"."user_id" = "users"."id" WHERE (profiles.age >= '15') AND (profiles.age <= '75') AND (profiles.gender IN(1,2)) - this is query when everything works. 

и с пользователями = users.active

SQLite3::SQLException: no such column: profiles.age: SELECT COUNT(*) FROM "users" WHERE (users.has_photo = 't') AND (profiles.age >= '21') AND (profiles.age <= '35') AND (profiles.gender IN(1,2)) 

has_photo просто метод, который я называю, когда пользователи добавляют фото:

def set_active(value) 

    self.has_photo = value 

    end 
+0

Это должно сработать. Я просто проверил что-то очень похожее, и он работал так, как вы планировали. Можете ли вы разместить свою модель «Пользователь»? В частности, часть, ссылающаяся на 'has_photo'? –

+0

Как насчет того, чтобы показывать нам запросы с и без. –

+0

SELECT COUNT (DISTINCT "users". "Id") FROM "users" LEFT OUTER JOIN "профили" ON "профили". User_id "=" users "." Id "WHERE (profiles.age> = '15') AND (profiles.age <= '75') AND (profiles.gender IN (1,2)) - это запрос, когда все работает. – nowy2781

ответ

0

Я не понимаю, почему вы добавляете каждое утверждение в новую строку, а не только цепочку то вроде этого:

users = User.includes(:profile).active.where('users.age = ? AND profiles.abc = ?', value, value2) 

должен работать без каких-либо проблем

EDIT: дал свой комментарий, я думаю, то вы должны изменить масштаб быть Proc

scope :active, Proc.new { where(:has_photo => true) } 

Я не уверен, причина, но поскольку Rails 4 все области необходимы, чтобы быть Procs, так что должно быть одно!

EDIT: stevanity более знающее на эту тему

Ну причина требуют проков или лямбды или простых блоков {} является избежать нетерпеливых оценок запросов. Такие запросы оцениваются в SQL, когда модель загружается в первый раз. Поэтому, если у вас было , было указано условие, которое было фактически динамическим, например, где (: created_at => Date.today), тогда оно всегда будет возвращать записи, созданные в тот день, когда было запущено конкретное приложение! Чтобы избежать всего этого, Rails4 требует, чтобы облачные области имели вызываемый proc/function/block/lambda как аргумент , чтобы их можно было вызывать и оценивать, когда это необходимо.

+0

потому что у меня есть пользователи = users.where ("profiles.age <=?", Age_to), если age_to.present? – nowy2781

+0

ОК, и если вы перепутаете первые два и добавьте еще два в новых строках, это произойдет? Пожалуйста, также обновите свой код, чтобы отразить логику ACTUAL, это может быть важно –

+0

, а во-вторых - когда я делаю это users = users.where ('users.has_photo =?', True) вместо users = users.active - он работает – nowy2781