范围通过关联:连接和合并

时间:2013-07-21 10:14:26

标签: ruby-on-rails scope model-associations

我有三个模型:UserProductTransaction。 (Transaction belongs_to both,User有很多ProductProduct有很多User,通过Transaction

在我的Transaction模型中,我有current个交易的范围:

scope :current, -> { where 'transactions.start_date IS NOT NULL AND transactions.end_date IS NULL' }

我希望能够在控制台中执行此操作,以便检索具有current事务的所有产品:

User.first.products.owned

在控制台中,我可以通过以下方式实现:

User.first.products.merge(Transaction.current.ownership)

首先尝试

所以我在我的Product模型中添加了这个:

def self.owned
  merge(Transaction.current.ownership)
end

我在控制台中输入:

User.first.products.owned

但是这里的rails控制台告诉我:

NoMethodError: undefined method `merge' for #<Class:0x00000004e2c0f8>
    from /home/flo/.rvm/gems/ruby-2.0.0-p195/gems/activerecord-4.0.0.rc1/lib/active_record/dynamic_matchers.rb:22:in `method_missing'

其他尝试

如果我在Product模型中添加此内容:

def self.owned
  joins(:transactions).merge(Transaction.current.ownership)
end

我在控制台中输入:

User.first.products.owned

但是它会检索当前交易的所有产品,而不仅仅是第一个用户当前交易的产品。

你知道我做错了什么吗?

2 个答案:

答案 0 :(得分:2)

  1. 首先尝试:您在merge上呼叫Productmerge我认为需要在{{1}上明确呼叫不像AR::Relationwhere&amp;等等。

  2. 第二次尝试joins搞乱了用户范围。

  3. 我建议您使用方法joins(对于rails&lt; 4)或scoped(对于rails&gt; = 4),它将代理方法所需的AR :: Relation {{1功能。

    all

答案 1 :(得分:1)

原因是您没有订购或限制您的产品。

scope :current, where('transactions.start_date IS NOT NULL AND transactions.end_date IS NULL').order("by whatever").limit(1)

您可能需要订购正确的产品,否则您可以删除订购方式。