0

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

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

get_current_user 返回一个唯一的用户, readable_projects 这个用户可以阅读的项目集合。到目前为止,一切都很好。但是,每个项目都有很多卡片,我想从集合中的每个项目中检索所有卡片,以便在这个结果中我可以查找特定卡片,然后检索其任务、关联Card和Task之间也是一个has_many。

我可以使用 each 遍历项目,但问题是我想使用查找的默认行为,这样如果在所有项目的所有卡片中我都找不到我正在寻找的卡片,则默认为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

然而,我的主要目标是以任何阅读代码的人都可以轻松理解我在这里做什么的方式获得这张卡。

我所有的模型关系如下:

用户.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

项目.rb:

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

卡.rb:

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

我的问题是:有没有办法在一个非常容易理解的行中完成这样的请求?预先感谢您的帮助。

4

0 回答 0