1

我第一次尝试在我的 Rails 应用程序中使用 HABTM 关系。下图显示了模型及其相互之间的关系:

架构

目前,我正在显示一个区域内的所有成员,其中包含以下内容:

<% @region.members.each do |member| %>
  <%= link_to member.name, member %>
<% end %>

我正在尝试按成员各自的级别对成员列表进行排序/排序。然后我想让成员按字母降序排列。

因此,members_controller 代码目前是默认的:

@members = Member.all

我可以按字母顺序排列结果:

@members = Member.order("name DESC").all

但我不知道如何使用相关模型的数据对成员记录进行排序。可能会有三个级别;慈善、基本和订阅。我计划在页面顶部设置一个仅显示订阅成员的块。订阅成员不应再次显示在页面上。

@subscribed_members = Member.where(:level == 1).order("name DESC").all

但是,如您所见,我不知道如何逐级过滤该块。

谁能指出我正确的方向,或者可能指向这个教程?我已经阅读了有关 HABTM 关系的 Rails 指南,但它似乎只涵盖了模型。

编辑

在尝试了这个建议之后,我现在有以下内容:

@members = Member.all
@subscribedmembers = Member.include(:levels)
                         .where("levels.name == 'subscriber'")

如何在区域视图中使用该方法?

<% @region.subscribedmembers.each do |member| %>
   <%= member.name %>
<% end %>

那是行不通的,因为它正在寻找一个不存在的名为 subscrivedmembers 的相关模型。

4

1 回答 1

0

对于此类任务,我建议您查看使用ActiveRecord. 方法是includejoins。让我用一段代码演示一下:

@subscribed_members = Member.include(:levels)
                            .where("members.url == 'test_url'")
                            .order("levels.name DESC")

如果在运行此查询后检查控制台,您可以看到include与两个表进行 SQL 连接。我在这里假设member :has_many :levels,因此您包含该表并在您的子句:levels中使用前缀列名。 一旦你有了这个想法,这并不难,所以我鼓励你在控制台上尝试这两种方法并检查结果。order

编辑

使用您的查询代码创建一个范围,然后在任何地方使用它。例子:

# On your model
scope :ultimate_level, include(:levels).where("name = 'test'").order("levels.name DESC")

# On your controller
@subscribed = Member.ultimate_level

# On your view
<% @subscribed.each do |s| %>

您也可以创建不同的范围,每个范围都进行一次操作,然后在我们的控制器上重用,等等。 Obs.:检查语法,我自己没有测试代码。

于 2012-12-27T23:07:23.540 回答