有没有办法在模型中使用.where()
的类似命令?
在我的实例中,我想循环遍历项目,但我想首先检查数据库值:
用户模型:
has_many :purchases
has_many :purchasedtools, through: :purchases, source: :tool #only where "status: "Completed"!
购买模式:
belongs_to :user
belongs_to :tool
工具模型:
belongs_to :user
has_many :purchases
工具控制器:
def index
@boughttools = current_user.purchasedtools
end
工具索引视图:
- @boughttools.limit(4).each do |tool|
我希望类似:@boughttools = current_user.purchases.where(status: "Completed", user_id: current_user.id)
。
唯一的区别是我需要purchasedtools
而不是purchases
,因为我希望将实际的工具作为来源。
幸运的是我不能只是改变它,因为我检查的db值在purchase
表上,而不在tool
表上。
每个答案都要提前感谢!如果您需要其他信息,请告诉我。
答案 0 :(得分:3)
正如我在评论中所建议的那样,您可能正在寻找条件关联:
has_many :purchasedtools,
-> { where(status: 'Completed') }
through: :purchases,
source: :tool
查看docs以获取有关关联的更多信息。
答案 1 :(得分:2)
要将范围添加到关联,只需将lambda或proc传递给关联宏:
class User
has_many :purchases
has_many :completed_purchases, ->{ where(status: 'Complete') },
class_name: 'Purchase'
has_many :purchased_tools
through: :completed_purchases
source: :tool
end
OP注意到的一种更简单的方法就是指定条件适用于连接表:
has_many :purchased_tools, -> { where(purchases: {status: "Completed"} ) }
through: :completed_purchases
source: :tool
答案 2 :(得分:0)
您可以使用joins
Purchase.joins(:tool).where(tools: {user_id: current_user.id}, purchases: {status: 'Completed'})