我试图通过在集合上一个接一个地应用的关联来访问特定对象。例如,我的一个数据库请求是:
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
我的问题是:有没有办法在一条非常容易理解的行中提出这样的请求? 提前感谢您的帮助。