Ruby对每个集合项

时间:2016-11-01 14:29:27

标签: ruby-on-rails collections associations ruby-on-rails-5 ruby-2.3

我试图通过在集合上一个接一个地应用的关联来访问特定对象。例如,我的一个数据库请求是:

get_current_user.readable_projects.cards.find(params[:card_id]).tasks

get_current_user返回一个唯一的User,reads_project这个用户可以读取的项目集合。到现在为止还挺好。但是,每个项目都有很多卡片,我想从集合中的每个项目中检索所有卡片,这样在这个结果中我可以查找特定卡片,然后检索其任务,卡和任务之间的关联也是一个has_many。

我可以用每个项目迭代项目,但问题是我想使用查找的默认行为,所以如果在所有项目的所有卡片中我都找不到我的那个寻找,触发默认的RecordNotFound例程。我也可以使用find_by并手动引发异常,做类似的事情:

   @projects = get_current_user.readable_projects
    @projects.each do |p|
      @found = p.cards.find_by(id: params[:card_id])
      break if @found.present?
    end
    if @found.present?
      @tasks = @found.tasks
    else
      raise ActiveRecord::RecordNotFound
    end

然而,我的主要目标是以这种方式获取此卡,任何阅读代码的人都可以轻松理解我在这里做的事情。

我所有的模特关系如下:

User.rb:

    has_many :reader_projects, -> { where "memberships.status = #{Membership::ACTIVE} AND memberships.role_id >= #{Membership::READER} " },
               through: :memberships, :class_name => 'Project', :source => :project
    has_many :contributor_projects, -> { where "memberships.status = #{Membership::ACTIVE} AND memberships.role_id >= #{Membership::CONTRIBUTOR} " },
               through: :memberships, :class_name => 'Project', :source => :project
    has_many :admin_projects, -> { where "memberships.status = #{Membership::ACTIVE} AND memberships.role_id >= #{Membership::ADMIN} " },
               through: :memberships, :class_name => 'Project', :source => :project

      def readable_projects
        self.reader_projects + self.contributable_projects
      end

      def contributable_projects
        self.contributor_projects + self.administrable_projects
      end

      def administrable_projects
        self.admin_projects
      end

Project.rb:

has_many :cards, inverse_of: :project, dependent: :destroy

Card.rb:

has_many :tasks, inverse_of: :card, dependent: :destroy

我的问题是:有没有办法在一条非常容易理解的行中提出这样的请求? 提前感谢您的帮助。

0 个答案:

没有答案