Как переопределить условие has_many по умолчанию для отношения в рельсах?

Я хотел бы ввести свое собственное условие для отношения has_many в моей модели ActiveRecord. Я хочу, чтобы мое условие переопределяло условие по умолчанию.

Class User < ActiveRecord::Base

  has_many :notifs, :conditions => 
   proc { "(notifs.user_id = #{self.id} OR notifs.user_id = 0)" }

И генерирует:

Загрузка уведомлений (0,2 мс) ВЫБЕРИТЕ notifs.* ИЗ notifs ГДЕ notifs.user_id = 1 И ((notifs.user_id = 1 ИЛИ notifs.user_id = 0))

Мне не нужно состояние активной записи по умолчанию (первые WHERE notifs.user_id = 1 вне скобок). Я хочу только свою. Как мне это указать?


person Benjamin Crouzier    schedule 27.05.2013    source источник


Ответы (2)


Для rails 4.1+ вы можете использовать unscope внутри сфера ассоциации.

class Post
  belongs_to :user
end

class User
  has_many :posts, -> { unscope(:where).where(title: "hello") }
end

User.first.posts
# => SELECT "posts".* FROM "posts" WHERE "posts"."title" = $1  [["title", "hello"]]
person droptheplot    schedule 20.01.2017

Замените :conditions на :finder_sql вот так:

has_many :notifs, 
  :finder_sql => proc { "(notifs.user_id = #{self.id} OR notifs.user_id = 0)" }

Подробнее в документации: http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_many

person Benjamin Crouzier    schedule 27.05.2013
comment
finder_sql был удален из 4.1. - person droptheplot; 16.01.2017