在Rails 3中使用has_and_belongs_to_many关系时订购记录?

时间:2012-12-27 22:17:57

标签: ruby-on-rails-3 model controller relationship

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

Schema

目前,我正在使用以下内容显示区域内的所有成员:

<% @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

但是,正如您所看到的,我不知道如何按级别过滤该块。

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

修改

在尝试完建议后,我现在有以下内容:

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

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

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

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

1 个答案:

答案 0 :(得分:0)

对于此类任务,我建议您查看使用ActiveRecord加入模型。方法是includejoins。 Lemme演示了一段代码:

@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。:检查语法,我自己没有测试代码。