Dea*_*ean 5 activerecord ruby-on-rails-3 active-record-query
我有一个称为“事件”的模型,另一个名为“产品”的模型。一个事件包含许多产品,而一个产品包含许多事件(通过称为的联接模型Eventproduct)。我正在尝试设计一个查询,该查询将选择在任何情况下当前日期范围都与另一个事件的日期都不匹配的所有产品,因此,当用户创建一个具有日期范围的事件时,它将显示可用的产品,以便同一产品不能同时出现2个事件。使用活动记录查询界面可以做到这一点,还是我需要编写自己的特定SQL查询。
我的迁移看起来像:
class CreateProducts < ActiveRecord::Migration
def change
create_table :products do |t|
t.string :make
t.string :model
t.integer :wattage
t.boolean :dmx
t.decimal :price
t.timestamps
end
end
end
class CreateEvents < ActiveRecord::Migration
def change
create_table :events do |t|
t.datetime :start_date
t.datetime :end_date
t.timestamps
end
end
end
class AddContactToEvent < ActiveRecord::Migration
def change
add_column :events, :name, :string
add_column :events, :location, :string
add_column :events, :contact_number, :string
end
end
class CreateEventproducts < ActiveRecord::Migration
def change
create_table :eventproducts do |t|
t.references :product
t.references :event
t.timestamps
end
add_index :eventproducts, :product_id
add_index :eventproducts, :event_id
end
end
Run Code Online (Sandbox Code Playgroud)
以下是相关的模型:
class Event < ActiveRecord::Base
attr_accessible :end_date, :start_date, :products, :lightings, :name, :location, :contact_number, :product_ids
has_many :products, :through => :Eventproduct
has_many :Eventproduct
validates_presence_of :name, :message => "can't be blank"
validates_presence_of :location, :message => "can't be blank"
validates_presence_of :contact_number, :message => "A telephone number is needed so that we can contact you if we have any problems"
validates_presence_of :start_date, :message => "can't be blank"
validates_presence_of :end_date, :message => "can't be blank"
end
class Eventproduct < ActiveRecord::Base
belongs_to :product
belongs_to :event
# attr_accessible :title, :body
end
class Product < ActiveRecord::Base
validates :price, numericality: {greater_than_or_equal_to: 0.01}
attr_accessible :make, :model, :wattage, :dmx, :price
end
Run Code Online (Sandbox Code Playgroud)
我想出了一个可以帮助你的查询。您必须弄清楚时间范围的条件及其逻辑。
查询应该类似于
Product.joins(:events).where("events.start_date <= :start_date", {start_date: Time.now})
Run Code Online (Sandbox Code Playgroud)
where 子句应包含过滤不需要的事件的逻辑。同样,这段代码应该可以帮助您入门。所以回答你的问题是有可能的。查看返回的查询并解决该问题以制定适合您需求的条件。另外,看看这个链接,它应该可以帮助您像我一样修改 where 子句: http: //guides.rubyonrails.org/active_record_querying.html
希望这对您有帮助!
更新:
您可能需要对 Product.all 进行一些设置差异,以包含那些根本没有事件的产品,因为如果产品在 EventProduct 表中没有事件,则该查询将返回空。它可能效率不高,但它应该根据您的需要起作用。
Product.all - Product.joins(:events).where("condition reversed")
Run Code Online (Sandbox Code Playgroud)
这应该返回所有不符合您的条件的产品,包括那些还没有事件的产品。
| 归档时间: |
|
| 查看次数: |
4431 次 |
| 最近记录: |