我是第一次尝试在我的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
但是,正如您所看到的,我不知道如何按级别过滤该块。
有人能指出我正确的方向,或者可能是为了这个教程吗?我已经阅读了Rails指南中的HABTM关系,但它似乎只涵盖了模型。
修改
在尝试完建议后,我现在有以下内容:
@members = Member.all
@subscribedmembers = Member.include(:levels)
.where("levels.name == 'subscriber'")
如何在区域视图中使用该方法?
<% @region.subscribedmembers.each do |member| %>
<%= member.name %>
<% end %>
这是行不通的,因为它正在寻找一个名为subscrivedmembers的相关模型,该模型不存在。
答案 0 :(得分:0)
对于此类任务,我建议您查看使用ActiveRecord
加入模型。方法是include
和joins
。 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。:检查语法,我自己没有测试代码。