2016-04-04 2 views
-1

Я пытаюсь сделать приложение в рельсах 4.Rails 4 - Ассоциация и Скоупс

У меня есть модели под названием Organisation, Profile и Project.

Ассоциации являются:

Organisation has_many :profiles

Profile belongs_to :organisation

Profile has_many :projects, dependent: :destroy

Projects belongs_to :profile

В моей шоу-странице организации, я хочу показать проекты, которые принадлежат к профилям где эти профили принадлежат организациям.

Как я могу это достичь?

Это основная структура, которую я пытаюсь адаптировать для организации ссылок для проецирования через профиль.

<% Organisation.find(params[:id]).projects.order('created_at DESC').in_groups_of(3) do |group| %> 
           <div id="portfolioFiltering" class="masonry-wrapper row"> 
            <% group.compact.each do |project| %> 

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

scope :by_organisation, ->(profile.organisation_id) { where(profile_id: profile.organisation_id) } 

Я не уверен, если я нахожусь на правильном пути. Я попытался сделать еще один в моих организациях моделей как:

scope :relevant_projects, ->(organisation_id) { where(organisation_id: project.profile.organisation_id) } 


<% Organisation.relevant_projects.find(params[:id]).projects.order('created_at DESC').in_groups_of(3) do |group| %> 
           <div id="portfolioFiltering" class="masonry-wrapper row"> 
            <% group.compact.each do |project| %> 

Когда я пытаюсь это, я получаю сообщение об ошибке, которое говорит:

wrong number of arguments (given 0, expected 1) 

Я не знаю, что это значит. Какая часть области является аргументом?

Может ли кто-нибудь увидеть, что я делаю неправильно?

UPDATE

Я попытался добавить ассоциации, как:

Организация:

has_many :projects, through: :profiles 

Проект:

belongs_to :organisation, through: :profile 

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

<% Organisation.projects.order('created_at DESC').in_groups_of(3).each do |group| %> 
            <div id="portfolioFiltering" class="masonry-wrapper row"> 
             <% group.compact.each do |project| %> 

Тем не менее, я получаю ошибку говорит:

undefined method `projects' for #<Class:0x007fe1e31988f0> 
+0

В области 'соответствующие_проекты' ожидается параметр, который должен быть вашим' organization_id'. – dp7

+0

Пройдя свой вопрос, я думаю, вы должны рассмотреть здесь ассоциацию has_many: via. Как вы можете добавить в модель 'Organisation', например' has_many: projects, через:: profiles'. Вы можете сделать что-то вроде этого, тогда '@ organisation.projects' – dp7

+0

Я пробовал, что имеет много сквозных, но я получаю ошибку undefined method 'projects'. Я скопировал свою попытку выше. Вы видите, где я ошибаюсь? – Mel

ответ

0

wrong number of arguments (given 0, expected 1) ошибка происходит из-за того, чтобы следовать объем, который ожидает organisation_id в качестве параметра.

scope :relevant_projects, ->(organisation_id) { where(organisation_id: project.profile.organisation_id) } 


Alternative

Вы можете использовать has_many through: связь здесь, которая может быть сделано просто, добавив следующую строку кода в Organisation модели -

has_many :projects, through: :profiles 

Теперь вы можете просто сделайте следующее, чтобы получить связанный projects организации -

Organization.first.projects 

Или, вы можете найти организацию, первую из таблицы базы данных, а затем получить свои проекты, как следующие -

@organisation = Organisation.find(params[:id]) #params[:id] provides an id of organisation and it is being fetched from the database using this query 
@organisation.projects #returns all the related projects of this organisation 

Надеется, что это помогает!

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