Rails 4 - 范围 - 表达形式

Rails 4 - scopes - form of expression

我正在尝试在 Rails 4.

中制作一个应用程序

我有用户、配置文件和项目的模型。

协会是:

User has_one :profile
Profile belongs_to :user & has_many :projects
Projects belongs_to :profile.

在我的个人资料显示页面中,我试图显示属于该个人资料的项目。

我尝试在我的项目模型中编写一个范围:

scope :by_profile, lambda { | profile_id | where(:profile_id => profile_id) }

然后,在我的个人资料显示页面中,我尝试将该范围用作:

<% Project.by_profile.sort_by(&:created_at).in_groups_of(3) do |group| %>
                        <div class="row">
                            <% group.compact.each do |project| %>
                            <div class="col-md-4">
                                <div class="indexdisplay">
                                    <%= image_tag project.hero_image_url, width: '80px', height: '80px' if project.hero_image.present? %>
                                    <br><span class="indexheading"> <%= link_to project.title, project %> </span>
                                </div>
                            </div>
                            <% end %>
                    <% end %>        
                        </div>

我是示波器的新手,仍在努力了解它的工作原理。我有点惊讶,如果我用 'all' 替换 'by_profile' 它实际上显示了一系列项目(我认为每个项目,而不仅仅是那些由相关个人资料页面的个人资料 ID 创建的项目)。

有人知道怎么写作用域吗?我应该在配置文件控制器中做些什么来帮助完成这项工作吗?

你在这里做什么

Project.by_profile..

不工作,因为你定义了范围 by_profile 和 arity 为 1(它应该得到 proffile_id),但你没有传递任何。

Project.by_profile(params[:profile_id]).sort_by(&:created_at).in_groups_of(3) # will work

但这里更简单的方法是使用关联:

Profile.find(params[:id]).projects.sort_by(&:created_at).in_groups_of(3)..

关于作用域你应该了解什么?它们几乎是“class”方法,但写得更好:)

调用作用域时,请确保向其传递正确数量的参数。

这里是定义作用域的一种较短的方法(-> 被称为 stubby lambda):

scope :by_profile, ->(profile_id) { where(profile_id: profile_id) }