gpt4 book ai didi

ruby-on-rails - 附加 args 时,Rails find 不会加入

转载 作者:行者123 更新时间:2023-12-04 07:04:21 25 4
gpt4 key购买 nike

我希望我在这里做错了什么,有人可以指出我正确的方向......

我在我的一个模型中编写了一个方法,这是代码:

def self.find_by_user_id(user_id, *args)
self.find(:all, :joins => :case_map,
:conditions => ['case_maps.uer_id = ? and case_maps.case_id = cases.id', user_id],
*args)
end

我可以像这样调用代码,它按预期工作:
Case.find_by_user_id(some_user_id)

但是,当使用任何其他参数执行此代码时,如下所示:
Case.find_by_user_id(some_user_id, :limit => 15)

我拿回所有情况。我的日志文件中的查询显示它执行了以下操作:
Case Load (0.6ms)   SELECT * FROM `cases` LIMIT 15

我什至在该方法中放置了一条 logger.info 消息以确保它是正在执行的消息...似乎每当 *args 不为零时,它就会跳过我添加到查找中的所有条件和连接,而只是使用*参数。

有人看到我做错了什么吗?

最佳答案

AR::B#find 需要可变数量的参数,但 最后 其中应该是选项哈希。它使用 Array#extract_options! ,你也可以:

def self.find_by_user_id(user_id, *args)
options = args.extract_options!
options.merge!(:joins => :case_map, :conditions =>
['case_maps.uer_id = ? and case_maps.case_id = cases.id', user_id])
self.find(:all, *args, options)
end

但你不应该。在 :all 和 options 字段之间哪些可能的值有意义?

你真正追求的是:
def self.find_by_user_id(user_id, options)
self.find(:all, options.merge(:joins => :case_map, :conditions =>
['case_maps.user_id = ? and case_maps.case_id = cases.id', user_id]))
end

或者一个更好的:
named_scope :find_by_user_id, lambda{|user_id|
{
:joins => :case_map,
:conditions => ['case_maps.user_id = ? and case_maps.case_id = cases.id', user_id]
}
}

命名范围将确保您的所有选项完全合并(即使您稍后添加更多条件,也会应用所有条件)。然后,您可以使用以下命令调用它:
Case.find_by_user_id(user_id).all(:limit => 15)

(命名范围是“Da Bom”。尽可能多地使用它们。即使在一般的谈话中。例如,如果你昨晚在我家,你可能无意中听到了这首小曲:“你想要什么?你的晚餐?”,“我每天晚上都吃同样的东西,命名的望远镜和薯条。”。因为我很投入等等。)

另外,作为旁注,假设这是在您的 Case 模型上,“ and case_maps.case_id = cases.id” 子句是不必要的, :joins => :case_map为你做那个。

关于ruby-on-rails - 附加 args 时,Rails find 不会加入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1358979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com