2015-04-10 2 views
12

У меня есть следующая схема: enter image description hereScoping с двумя внешними ключами

Я хочу, чтобы иметь возможность позвонить proposals для обоих foreign_keys (author_id и editor_id), а также для отдельных из них (например, author_proposals и editor_proposals) и Мне нужно иметь возможность ленить или загружать их (например, User.includes(:proposals) или без него с joins).

Update:

#I have the scopes which is like this: 
class User < ActiveRecord::Base 
    has_many :author_proposals, class_name: 'Proposal', foreign_key: :author_id 
    has_many :editor_proposals, class_name: 'Proposal', foreign_key: :editor_id 
end 

class Proposal < ActiveRecord::Base 
    belongs_to :author, class_name: 'User', foreign_key: :author_id 
    belongs_to :editor, class_name: 'User', foreign_key: :editor_id 
end 

Но мне нужен универсальный тот, который он даст мне все предложения (как author_proposals и editor_proposals), которые он будет также стремится загрузить их. Должен ли я использовать условия на has_many?

+1

Post код, который вы написали до сих пор для этого – RAJ

+0

у меня нет кода, то есть то, что я прошу! :) Каков предпочтительный способ сделать это? Это сфера охвата и прохождение лямбда? Используется ли «условия»? – JohnDel

ответ

5

Вы можете сделать что-то вроде:

class User < ActiveRecord::Base 
    has_many :authored_proposals, class_name: 'Proposal', foreign_key: :author_id 
    has_many :editored_proposals, class_name: 'Proposal', foreign_key: :editor_id 

    def proposals 
    authored_proposals | editored_proposals 
    end 
end 

class Proposal < ActiveRecord::Base 
    belongs_to :author, class_name: 'User', foreign_key: :author_id 
    belongs_to :editor, class_name: 'User', foreign_key: :editor_id 

    def users 
    author | editor 
    end 
end 

Вы можете нетерпеливый нагрузки proposals по делает: User.includes(:authored_proposals, :editored_proposals). Это не чистый путь рельсов, но кажется мне более чистым.



Вы также можете сделать:

class User < ActiveRecord::Base 
    has_many :authored_proposals, class_name: 'Proposal', foreign_key: :author_id 
    has_many :editored_proposals, class_name: 'Proposal', foreign_key: :editor_id 

    has_many : proposals, finder_sql: proc { "SELECT * FROM proposals WHERE (proposals.author_id = #{id} or proposals. editor_id = #{id})" } 
end 
1

Установите ваши ассоциации, как это:

class User < ActiveRecord::Base 
    has_many :author_proposals, :class_name => "Proposal", :foreign_key => "author_id" 
    has_many :editor_proposals, :class_name => "Proposal", :foreign_key => "editor_id" 
end 

class Proposal < ActiveRecord::Base 
    belongs_to :author, :class_name => 'User', :foreign_key => "author_id" 
    belongs_to :editor, :class_name => 'User', :foreign_key => "editor_id" 
end 
+0

Спасибо. Это для простых 'author_proposals' и' editor_proposals', но мне нужно, чтобы предложения, в которых он найдет все предложения. – JohnDel

7

Я хотел бы сделать что-то вроде этого:

class User < ActiveRecord::Base 
    has_many :authored_proposals, class_name: 'Proposal', foreign_key: :author_id 
    has_many :editored_proposals, class_name: 'Proposal', foreign_key: :editor_id 

    def proposals 
    Proposal.where('author_id = :id OR editor_id = :id', { id: id }).distinct 
    end 
end 

class Proposal < ActiveRecord::Base 
    belongs_to :author, class_name: 'User', foreign_key: :author_id 
    belongs_to :editor, class_name: 'User', foreign_key: :editor_id 

    def users 
    User.where(id: [author_id, editor_id].uniq) 
    end 
end 
+0

Это то, что я думал сначала, я думал создать новый метод, но мне нужно его загрузить. Так, например, этот не будет работать: User.includes (: предложения). Сначала, и я не чувствую, что это рельсы. – JohnDel

+1

Почему не просто 'User.includes (: authored_proposals,: editored_proposals)'? – spickermann

+0

Хорошая идея Я могу добавить следующее: 'scope: предложения, -> (пользователь) {user.includes (: authored_proposals,: editored_proposals)}' , но тогда, когда я вызываю 'User.proposals', он всегда будет загружен eage_loaded. Я буду удивлен, если не будет никаких других способов рельсов. – JohnDel

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