【问题标题】:Selecting Third-tier ActiveRecord_Relation - Rails, ActiveRecord, HABTM选择第三层 ActiveRecord_Relation - Rails、ActiveRecord、HABTM
【发布时间】:2015-03-10 02:29:01
【问题描述】:

我有三个模型。 UserMessageFilter,关系如下图。如何选择User.find(*).filters.messages

用户:

  • has_many :filters
  • has_and_belongs_to_many :messages

消息:

  • has_and_belongs_to_many :users
  • has_and_belongs_to_many :filters

过滤器:

  • belongs_to :user
  • has_and_belongs_to_many :messages

编辑 1:

我将结果分配给一个名为 @filtered_messages 的实例变量,并希望在我的视图中遍历它。

这是我的行动:

...
def show
  @filtered_messages = ...
end
...

这是我的部分观点(摘要):

<% @filtered_messages.each do |message| %>
...
  <%= message.author%> #author is a column in messages_tables
...
<% end %>

【问题讨论】:

    标签: ruby-on-rails ruby database activerecord has-and-belongs-to-many


    【解决方案1】:

    你应该可以这样做:

    class User
      has_many :filters
      has_and_belongs_to_many :messages
      has_many :filter_messages, through: :filters, class_name: 'Message'
    end
    

    然后@user.filter_messages 应该返回你想要的。

    【讨论】:

    • 获得一个 NoMethod - undefined method to_sym' for nil:NilClass`
    • 你从哪里得到的?在 Rails 上启动?还是在视图中?还是在控制台中?
    • 在我的users_controller 中,分配给@filtered_messages 时
    【解决方案2】:

    听起来您想获取一个用户的所有过滤器的所有消息。是对的吗?试试这个:

    User.find(*).filters.includes(:messages).map { |filter| filter.messages }.flatten

    【讨论】:

    • 我试图将它分配给一个名为@filtered_messages 的实例变量,然后在我的视图中遍历它。虽然此解决方案确实在控制台中返回了我想要的集合,但在我看来,我得到了 #<:activerecord_associations_collectionproxy:....> 的 undefined method ...'。
    • 试试上面@evanbikes 的回答。如果这不起作用,您可以发布用于在视图中进行迭代的代码吗?
    • 如果你想在视图中使用这个,你必须在最后添加.flatten
    • ^^ 你能解释一下吗?
    • @Dimitry_N 我认为您想要的实际上与此相反。所以交换所有消息和过滤器,它应该返回一个过滤消息数组。
    【解决方案3】:

    试试这个:

    User.find(1).filters.first.messages
    

    【讨论】:

    • 这可行,但我有多个filter 对应每个user,需要全部选择。
    【解决方案4】:

    试试

    Message.joins(:filters).where(filters {user_id: user_id})
    

    但将 user_id 替换为您在应用中确定的用户 ID。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多