Rails 4:模型逻辑 - (有限关联)

时间:2016-09-25 19:12:15

标签: ruby-on-rails ruby ruby-on-rails-4 model controller

有没有办法在模型中使用.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表上。


每个答案都要提前感谢!如果您需要其他信息,请告诉我。

3 个答案:

答案 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

请参阅Scopes for has_many

答案 2 :(得分:0)

您可以使用joins

Purchase.joins(:tool).where(tools: {user_id: current_user.id}, purchases: {status: 'Completed'})