我有一个看起来像这样的数据模型;
class Tran < ActiveRecord::Base
belongs_to :buyer
validates :buyer_id, presence: true
belongs_to :seller
validates :seller_id, presence: true
end
class Seller < ActiveRecord::Base
has_many :trans
has_many :buyers, through: :trans
validates :seller_id, presence: true
end
class Buyer < ActiveRecord::Base
has_many :trans, :foreign_key => "buyer_id"
has_many :sellers, through: :trans
validates :buyer_id, presence: true
end
然后在每个卖家页面上,我都有以下代码,我可以成功列出卖家的最高买家名单,根据他们的总支出下降。
<ol>
<% @seller.buyers.uniq{|t| t.buyer_id }.sort_by {|su| su.trans.sum(:sum)}.reverse.each do |su| %>
<li><%= su.name %> <%= su.trans.sum(:sum) %></li>
<% end %>
</ol>
此代码的作用是,它仅验证从卖方购买产品的买方,但它目前不验证卖方提供的Trans(例如,在所有卖方之间提取数据)。
我已尝试围绕seller.id进行第二次验证,但不确定如何进行验证。
有没有人有解决方案?
基本上,列表需要在Tran上验证,sell_id既由卖方拥有,又存在于Trans join表中,并且它也引入buyer_id,但只包含supplier_id和buyer_id的交易在场。
答案 0 :(得分:0)
删除不需要的代码......只有纯has many through association
...它应该是
class Buyer< ActiveRecord::Base
has_many :trans
has_many :sellers, through: :trans
validates_presence_of :sellers
##or you can use blocks also such as below for validation(not null)
has_many :sellers,through :trans,:reject_if => proc { |a| a['name'].blank? }
end
class Tran< ActiveRecord::Base
belongs_to :buyers
belongs_to :sellers
end
class Seller< ActiveRecord::Base
has_many :trans
has_many :buyers, through: :trans
validates_presence_of :buyers
end
###to get all sellers of a buyer
@buyer.sellers
##to get all buyers from a seller
@seller.buyers
要使这项工作......你需要有三个迁移文件,包括只有两个column-buyer_id和seller_id的trans表,这将阻止买家/卖家之间的连接回退,因此你不需要验证buyer_id / seller_id < / p>
class CreateBuyersSellersTrans < ActiveRecord::Migration
def change
create_table :buyers do |t|
##ensures uniqueness
t.string :name, unique: true
t.timestamps
end
create_table :sellers do |t|
##ensures uniqueness
t.string :name, unique: true
t.timestamps
end
create_table :trans do |t|
t.belongs_to :buyer
t.belongs_to :seller t.timestamps
end
end
end
控制器中的
#get all uniq buyers of a seller in array format removing empty even if exits
@sellers=@seller.buyers.flatten.compact.uniq.delete_if(&:blank?)
在您的视图中
<ol>
<% @sellers.sort_by {|su| su.trans.sum(:sum)}.reverse.each do |su| %>
<li><%= su.name %> <%= su.trans.sum(:sum) %></li>
<% end %>
</ol>
答案 1 :(得分:0)
而不是让卖方和卖方的买方,然后买方的Trans,如何获得卖方和卖方的Trans,然后买方&#39 ;来自每个卖方的Trans?
的信息