【发布时间】:2016-07-23 17:53:46
【问题描述】:
我正在尝试在 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)
我不知道这是什么意思。范围的哪一部分是参数?
谁能看出我做错了什么?
更新
我尝试将关联添加为:
组织:
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>
【问题讨论】:
-
您的
relevant_projects范围需要一个参数,该参数应该是您的organization_id。 -
在完成你的问题之后,我认为你应该在这里考虑
has_many :through关联。就像您可以添加Organisation模型一样has_many :projects, through: :profiles。你可以这样做然后@organisation.projects -
我尝试了很多通过 - 但我得到错误未定义的方法“项目”。我在上面复制了我的尝试。你能看出我哪里出错了吗?
-
belongs_to :organisation, through: :profile您无需将其添加到Project模型。并且,获取Organisation的对象,然后对其使用关联。喜欢@organisation = Organisation.first然后@organisation.projects应该会返回相关项目。 -
这种方法解决了您的问题吗?
标签: ruby-on-rails scope associations