【问题标题】:Rails active record filtering or named scoping difficultiesRails 活动记录过滤或命名范围困难
【发布时间】:2012-07-22 21:18:04
【问题描述】:

我定义了以下一组类和关系,我希望能够构建所有事件的集合,其中至少包含一个特定用户已被标记的故事。

即在我的事件控制器中,我希望能够调用类似 Event.events_user_is_in(@user) 的东西,它返回包含用户已被标记的故事的每个事件。

class Event < ActiveRecord::Base
  has_many :stories
end

class Story < ActiveRecord::Base
  belongs_to :event
  has_many: tags
end

class Tag< ActiveRecord::Base
  belongs_to :story
  belongs_to :user
end

class User< ActiveRecord::Base
  has_many :tags
end

我一直在阅读有关范围界定的内容,并成功在 Story 上生成了范围界定,它仅返回用户被标记的故事,但我不知道如何为事件执行此操作。任何帮助将不胜感激!

【问题讨论】:

    标签: ruby-on-rails ruby activerecord filtering named-scope


    【解决方案1】:

    您可以根据需要使用方法或范围:

    class Event < ActiveRecord::Base
    
      scope :events_user_is_in, lambda {|user|
        joins(:stories => :tags).where("tags.user_id = ?", user.id).uniq
      }
    
    end
    

    【讨论】:

    • 太棒了!这就是我需要的连接,唯一的问题是,如果在事件多次返回的情况下用户被标记在多个故事中,是否有某种不同的关键字可以用来防止这种情况发生?
    • 当然,你可以在 Rails 3.2 中使用 'uniq' 方法,或者手动添加 .select("DISTINCT (events.*)")...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    相关资源
    最近更新 更多