我有三个模型:User
,Product
和Transaction
。
(Transaction
belongs_to both,User
有很多Product
,Product
有很多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
但是它会检索当前交易的所有产品,而不仅仅是第一个用户当前交易的产品。
你知道我做错了什么吗?
答案 0 :(得分:2)
首先尝试:您在merge
上呼叫Product
但merge
我认为需要在{{1}上明确呼叫不像AR::Relation
,where
&amp;等等。
第二次尝试:joins
搞乱了用户范围。
我建议您使用方法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)
您可能需要订购正确的产品,否则您可以删除订购方式。