1

Я хочу, чтобы повысить пользователь следующим с ожидающим статусом:ActiveRecord has_many: через где статус = «в ожидании»

class Relationship < ActiveRecord::Base 
    belongs_to :follower, class_name: "User" 
    belongs_to :followed, class_name: "User" 
end 

class User < ActiveRecord::Base 
    has_many :active_relationships, class_name: "Relationship", 
            foreign_key: "follower_id", 
            dependent: :destroy 
    has_many :following, through: :active_relationships, source: :followed 
    has_many :passive_relationships, class_name: "Relationship", 
            foreign_key: "followed_id", 
            dependent: :destroy 
    has_many :followers, through: :passive_relationships, source: :follower 
end 

Итак, я добавил одну миграции в поле состояния

rails g migration AddStatusToRelationships 

class AddStatusToRelationships < ActiveRecord::Migration 
    def change 
    add_column :relationships, :status, :string 
    end 
end 

Отношение таблица теперь выглядит как

id | follower_id | followed_id | status 

Цель состоит в том, чтобы показать отношения со статусом: "pending"

мой подход к повышению

has_many :followers, through: :passive_relationships, source: :follower 

с чем-то вроде

has_many :followers, -> { where status: "pending" }, through: 
       :passive_relationships, source: :follower 

дает мне

SQLite3::SQLException: no such column: users.status: SELECT COUNT(*) 
FROM "users" INNER JOIN "relationships" 
ON "users"."id" = "relationships"."follower_id" 
WHERE "relationships"."followed_id" = ? 
AND "users"."status" = 'pending' 

Так что я попытался

has_many :followers, through: :passive_relationships -> { 
       where status: "pending" }, source: :follower 

который возвращает

SyntaxError in UsersController#show app/models/user.rb:20: 
syntax error, unexpected ->, expecting keyword_end ...ough: 
:passive_relationships -> { where status: "pending" }, 
... ...^app/models/user.rb:20: 
syntax error, unexpected ',', expecting keyword_end ...-> { 
where status: "pending" }, source: :follower ...^

Я попытался также

has_many :pending, through: :passive_relationships, 
    source: :follower, 
    :conditions => ['passive_relationships.status = ?','pending'] 

который возвращает

Unknown key: :conditions. Valid keys are: :class_name, :anonymous_class, 
:foreign_key, :validate, :autosave, :table_name, :before_add, :after_add, 
:before_remove, :after_remove, :extend, :primary_key, :dependent, :as, 
:through, :source, :source_type, :inverse_of, :counter_cache, :join_table, 
:foreign_type 

Спасибо за помощь!

ответ

1
has_many :followers, -> { joins (:relationships).where(relationships: { status: 'pending' }) }, through: :passive_relationships, source: :follower 

я бы записать его в следующем виде, но не уверен, если это допустимый синтаксис (в силу Stabby состояния лямбда):

has_many :followers, 
    -> { joins(:relationships).where(relationships: { status: 'pending' }) }, 
    through: :passive_relationships, 
    source: :follower 
+0

Это указывает на user.status, вместо того, чтобы отношения .status
SQLite3 :: SQLException: нет такого столбца: users.status: SELECT COUNT (*) FROM "users" INNER JOIN "отношения" ON "users". "id" = "отношения". "follower_id" WHERE "отношения" . "follow_id" =? И «пользователи». «Status» = «pending» –

+0

@Stef Hej обновится на минуту, просто используйте 'joins' –

+0

работает точно так, как ожидалось, спасибо !!! –

Смежные вопросы